Berechne die höchste Potenz von 2, die in C gleichmäßig eine Zahl teilt

7

Ich muss etwas Logik schreiben, um eine gerade Zahl zu bestimmen. Die höchste Macht von zwei, die es gleichmäßig teilt. Was ist der Maximalwert von 2 ^ n wo Eingabe% 2 ^ n == 0?

IE:
Eingabe - & gt; Ausgabe

%Vor%

Es sieht so aus, als gäbe es eine bitweise Logik, die funktionieren könnte: Wenn man sich die Eingabe im Binärformat anschaut, erscheint das rechte Bit als Lösung. Wie ermittle ich diesen Wert in C? Gibt es eine andere Lösung, die einfacher sein könnte?

Danke Jonathan

    
tostao 11.10.2009, 21:07
quelle

4 Antworten

17

Wenn Sie bereit sind, die Zweierkomplementarithmetik anzunehmen:

x & -x

Wenn Sie so etwas tun (oder auch nur, wenn Sie es interessant finden), finden Sie sich eine Kopie des Buches "Hacker's Delight".

edit: Avakar stellt korrekt fest, dass dies nicht vom Zweierkomplement abhängt, wenn der Typ unsigniert ist. Der relevante Abschnitt der Norm ist § 6.2.5, Absatz 9:

  

Eine Berechnung mit unsigned   Operanden können niemals überlaufen, weil a   Ergebnis, das nicht dargestellt werden kann   Der resultierende vorzeichenlose Integertyp ist   reduziert modulo die Zahl, die eins ist   größer als der größte Wert, der   kann durch das resultierende dargestellt werden   Geben Sie ein.

"Einer, der größer ist als der größte Wert" lässt etwas Spielraum für eine besonders perverse Implementierung (insbesondere eine Implementierung, die beispielsweise keine Binärdatei verwendet), aber das ist ziemlich unwahrscheinlich.

>     
Stephen Canon 11.10.2009 21:23
quelle
7

Ohne Gleitkommaarithmetik zu verwenden:

%Vor%

Vereinfachungen und Edge Cases bleiben als Übungen für den Leser übrig.

    
Greg Hewgill 11.10.2009 21:15
quelle
6

Wir können (-x) durch (~x + 1) ersetzen:

%Vor%

Low Level Bit Hacks, die du unbedingt kennen musst bietet eine detaillierte Erklärung.

    
jfs 11.10.2009 21:57
quelle
3

Eine Zahl in der Form 2 ^ n wird binär durch eine 1 geschrieben, gefolgt von einer Folge von 0 oder mehr 0s. Zum Beispiel, 1, 10, 100, 1000, ... usw. sind alle zwei Potenz.

Um die höchste Potenz von 2 zu erhalten, die eine gegebene Zahl teilt, können Sie die folgenden zwei Schritte ausführen:

  1. Schreibe die Zahl in binärer Form. Beispiel: Wenn die Zahl 168 ist, schreiben Sie 10101000.

  2. Streichen Sie alle Bits vor dem ersten Bit von der rechten Seite ab, die 1 enthält. Im Fall von 168 bleibt 1000 (= 8 in Dezimal) übrig, nachdem der erste Teil von 10101000 abgeklopft wurde.

    >

Was bleibt, ist Ihr Ergebnis - das heißt, die höchste Potenz von 2, die die Zahl teilt.

Programmgesteuert ist x die Eingangsnummer. Dann ist Ihre gewünschte Ausgabe: x - (x ^ (x-1))

Erläuterung:

x ^ (x-1) [bedeutet x XOR x-1] wird die erste 1 von der LSB (least significant bit) -Seite los.

x - (x ^ (x-1)) entfernt den verbleibenden Teil und behält nur die erste 1 von der LSB-Seite bei.

    
Kunal Das 27.12.2012 08:04
quelle

Tags und Links