2017-01-29 1 views
0

Ich habe zwei ungleiche ganze Zahlen, die nur ein von Null verschiedenes Bit enthalten. Wie kann man testen, welche Integer ein signifikanteres Bit hat?Welche Ein-Bit-Ganzzahl hat ein signifikanteres Bit?

Beispiel:

test(0b1000_0000, 0b0100_0000); // Should return true 
test(0b0010_0000_0000, 0b0100_0000_0000); // Should return false 

Was ist die effizienteste Implementierung von test?

+5

Vergleichen Sie sie einfach numerisch – rkosegi

+0

@rkosegi Ganzzahlen sind in Java signiert. Dies funktioniert nicht für negative ganze Zahlen. – ZhekaKozlov

Antwort

0

Ich denke, das ist die effizienteste Implementierung. Und das funktioniert für negative Zahlen zu:

static boolean test(int int1, int int2) { 
    return ((int2 - 1) & int1) == 0; 
} 
+1

Was ist das für Hexerei? – shmosel

+1

Subtrahieren von einem von einer Zahl, die nur ein gesetztes Bit hat, schaltet das gesetzte Bit aus, aber schaltet alle folgenden Bits ein, wie in 10000 → 1111. Und das mit der anderen Nummer, die auch nur ein gesetztes Bit hat wird nur dann ungleich Null sein, wenn das gesetzte Bit eines der folgenden Bits der ursprünglichen Nummer war. –

4

Hinweis: Die „saubere“ Art und Weise, es zu tun ist entweder Integer.compareUnsigned oder Integer.numberOfLeadingZeros zu verwenden.

(Caveat: Die "unsigned" Methoden in Java nur verfügbar sind, 8 und später ...)


Was ist die effizienteste Implementierung von Test?

Die Antwort auf den Effizienzteil Ihrer Frage wird plattformspezifisch sein. Wenn Sie wirklich interessiert sind, benchmarken Sie die verschiedenen Alternativen, die die Menschen bieten.

+0

Es ist tatsächlich schwierig, dies zu benchmarken, da jede vernünftige Implementierung schnell genug ist, dass sie im Overhead verloren geht. –

+1

Sie können dies mit einem entsprechend entworfenen Benchmark lösen, der mit einem guten Microbenchmark-Framework implementiert wurde. –

+0

Hinweis: Führen Sie die Operation viele Male durch, messen Sie die Gesamtzeit und dividieren Sie sie durch die Anzahl der Wiederholungen. (Oder nicht und vergleiche die Gesamtzeiten ...) Wie auch immer, 1) es ist nicht so schwer, 2) es gibt Frameforks, und 3) wenn das OP sich um solche Dinge kümmert, dann sollte er * lernen * Mach diese Art von Benchmarking. –

Verwandte Themen