2016-07-25 25 views
-2

Wenn ich einen Eingang habe, sagen wir 51 (00110011) und einen Index i, der einen Bit-Index darstellt (zB i = 0 -> 1, i = 2 -> 0), wie finde ich eine Potenz von 2 wie diese Beispiele . Tut mir leid, ich bin nicht großartig mit mathematischer Notation, aber ich kann Beispieleingabe und -ausgabe geben.Gibt es eine Nummer (Bitfolge) und einen Bit-Index, wie finde ich das nächsthöchste Bit?

Beispiel: Bei 51 und Index angegeben 1 (001100 1), möchte ich eine Funktion 00010000 = 16.

Auch zurückzukehren, wenn 2 173 und Index angegeben (10101 01), Die Funktion muss 00001000 = 8 zurückgeben.

Ich bin auf der Suche nach einer Lösung, die Bit-Operationen und keine Schleifen basierend auf der Größe der Zahl vorzugsweise verwendet.

EDIT: Dies ist keine Hausaufgaben. Ich schreibe ein Programm, das Benutzerauswahlen als Nummer speichert. Ich versuche mich hier herauszufordern. Hier

ist, was wenig ich habe in der Lage

x--; 
    for (int j = 0; j < 5; j++) { 
     x |= x >> (int) Math.pow(2, i); 
    } 
    x++; 
    return x; 

Dies nimmt eine 32-Bit-Zahl zu tun und gibt die nächste Potenz von 2. Ich bin nicht sicher, ob dies von Nutzen ist aber mein Problem. Ich habe versucht, zu sehen, ob jemand anderes etwas Ähnliches geposted hat und das ist, was ich gefunden habe und dachte, dass es in dem, was ich versuche, spielen könnte.

EDIT 2 Ich habe Benutzer Tage der Woche auswählen und diese Tage in einer einzigen Nummer speichern. Bei einem gegebenen Tag möchte ich den nächsten Tag finden, den der Benutzer ausgewählt hat. Ich kann das leicht machen, indem ich die Zahl in ein boolesches Array umwandle, aber ich wollte sehen, ob es noch andere clevere Lösungen gibt. Ich entschuldige mich, wenn es zu "Hausaufgaben" ist.

Ich habe erkannt, wenn ich eine Zahl wie 51 (00110011) und Index 1 nehme, kann ich die ersten zwei Bits durch Division durch 2^1 = 001100 rasieren. Dann möchte ich, dass das Programm die Position von finden die erste 1 (Index 2). Dann sollte es 2^(2 + 2) zurückgeben, weil es 2 Bits abrastete und die nächste logische 1 danach bei Index 2 lag.

+1

Wo ist dein Versuch? Dies ist kein Hausaufgabenlösungsdienst. – Kon

+0

Das sind keine Hausaufgaben. Ich schreibe ein Programm, das Benutzerauswahlen als Nummer gespeichert hat. Ich versuche mich hier herauszufordern. – sadelbrid

+1

Also bitte posten Sie Ihren Versuch, diese Herausforderung zu lösen, damit wir Ihnen helfen können zu verstehen, was falsch ist oder fehlt – Kon

Antwort

1

Sie müssen sowieso eine Schleife verwenden. Für Java, richtig? Der Code:

public class Test { 
    public static void main(String[] args) { 
     System.out.println(yourHomework(51,1)); 
     System.out.println(yourHomework(173,2)); 
    } 
    public static int yourHomework(int number, int index) { // LOL!! Joke! 
      for (int i = index + 1; i < 32; i++) { 
       if ((number | (1 << i)) == number) 
        return 1 << i; 
      } 
      return 0; // Or the value it must return if there is not answer 
    } 
} 

Hilft dies ?. Ich teste es mit Ihren Fällen & es funktioniert, aber ich bin mir nicht sicher, das ist, was Sie brauchen.

+0

Hey danke das hat den Trick! Ich war mir nicht sicher, ob es einen einfachen Weg ohne Looping gab oder nicht ... Wie auch immer, Prost, Kumpel! – sadelbrid

1

Es gibt auch einen Non-Loop-Weg.

Es gibt einfache Tricks, um Dinge mit dem niedrigst gesetzten Bit zu tun, wie zum Beispiel Nullsetzen oder Isolieren. In diesem Fall werden wir es auf Null gesetzt:

int x = days & (days - 1); 

Dies funktioniert, weil eine Subtraktion wird durch die nachfolgenden Nullen borgen, bis er auf den niedrigsten Satz Bit erhält, die es zurücksetzt und dann die Kreditaufnahme stoppt.

Wenn wir nur den jetzt niedrigsten Satz Bit isolieren, müssen in x, gibt es einen einfachen Trick, für das auch:

int mask = x & -x; 

Dies funktioniert, weil eine alternative Art und Weise -x zu schreiben ~x + 1 ist, was deutlich macht, dass es wird die "hohen Bits" umgedreht haben, aber der Teil bis einschließlich dem niedrigsten gesetzten Bit in x bleibt gleich (es wurde umgedreht, aber dann führt die +1 durch, es dreht alles zurück).

Wahrscheinlich müssen wir irgendwann auch den Index dieses Bits bekommen. Java hat Integer.numberOfTrailingZeros dafür, das eine Java-Implementierung hat, die klüger ist, als diese Nullen nacheinander zu durchlaufen und zu zählen, und einige Plattformen können durch eine native Anweisung implementiert werden (HotSpot kann dies tun, aber natürlich nicht unbedingt jede JVM an) jede Plattform kann oder wird es tun).

Wie auch immer:

int pos = Integer.numberOfTrailingZeros(x); // note that we can use x here