wake-up-neo.com

Was ist (x & 1) und (x >> = 1)?

Ich versuche die Zuweisung: "Finde die Anzahl der Bits in einem vorzeichenlosen Integer-Datentyp, ohne die Funktion sizeof () zu verwenden."

Mein Ziel ist es, die Ganzzahl in Bits umzuwandeln und sie dann zu zählen. Zum Beispiel: 10 is 1010 und 5 is 101

Konvertieren einer Ganzzahl in eine Bitdarstellung zeigt ungefähr Folgendes:

do
{ 
    Vec.Push_back( x & 1 ) 
} 
while ( x >>= 1 );

Ich möchte nicht nur Inhalte kopieren und einfügen. Wenn ich F-10 benutze, sehe ich, was (x & 1) macht es, aber ich weiß nicht, ob es ein Name ist oder wie es seine Arbeit macht (etwas vergleichen?). Auch ich weiß >= welche "größer als oder gleich" aber was ist x >>= 1?

Hinweis: Das markierte Duplikat ist ein JavaScript und kein C++

36
Sandra K

Dies sind Bitweise Operatoren ( Referenz ).

x & 1 Erzeugt einen Wert, der entweder 1 Oder 0 Ist, abhängig vom niedrigstwertigen Bit von x: wenn das letzte Bit 1 ist das Ergebnis von x & 11; ansonsten ist es 0. Dies ist eine bitweise UND-Verknüpfung.

x >>= 1 Bedeutet "x um ein Bit nach rechts verschoben setzen". Der Ausdruck wird nach der Verschiebung zum neuen Wert von x ausgewertet.

Hinweis: Der Wert des höchstwertigen Bits nach der Verschiebung ist Null für Werte ohne Vorzeichen. Bei Werten vom Typ mit Vorzeichen wird das höchstwertige Bit vor dem Verschieben als Teil von Vorzeichenerweiterung aus dem Vorzeichenbit des Werts kopiert, sodass die Schleife niemals beendet wird, wenn x ist ein vorzeichenbehafteter Typ und der Anfangswert ist negativ.

34
dasblinkenlight

x & 1 ist äquivalent zu x % 2.

x >> 1 ist äquivalent zu x / 2

Diese Dinge sind also im Grunde das Ergebnis und der Rest der Division durch zwei.

18
rama

Neben der Antwort von "dasblinkenlight" denke ich, könnte ein Beispiel helfen. Ich werde zum besseren Verständnis nur 8 Bits verwenden.

x & 1 Erzeugt einen Wert, der entweder 1 Oder 0 Ist, abhängig vom niedrigstwertigen Bit von x: wenn das letzte Bit 1 ist das Ergebnis von x & 11; ansonsten ist es 0. Dies ist eine bitweise UND-Verknüpfung.

Dies liegt daran, dass 1 In Bits als 00000001 Dargestellt wird. Nur das letzte Bit ist auf 1 Gesetzt. Nehmen wir an, x ist 185, Das in Bits als 10111001 Dargestellt wird. Wenn Sie eine bitweise UND-Verknüpfung auf x mit 1 Anwenden, ist dies das Ergebnis:

00000001
10111001
--------
00000001

Die ersten sieben Bits des Operationsergebnisses lauten nach der Operation 0 Und enthalten in diesem Fall keine Informationen (siehe logische UND-Operation ). Denn was auch immer die ersten sieben Bits des Operanden x vorher waren, sie lauten nach der Operation 0. Aber das letzte Bit des Operanden 1 Ist 1 Und zeigt an, ob das letzte Bit des Operanden x0 Oder 1 War. . In diesem Beispiel ist das Ergebnis der bitweisen UND-Operation 1, Da unser letztes Bit von x1 Ist. Wenn das letzte Bit 0 Gewesen wäre, wäre das Ergebnis auch 0 Gewesen, was anzeigt, dass das letzte Bit des Operanden x0 Ist:

00000001
10111000
--------
00000000

x >>= 1 Bedeutet "x um ein Bit nach rechts verschoben setzen". Der Ausdruck wird nach der Verschiebung zum neuen Wert von x ausgewertet

Lassen Sie uns das Beispiel von oben auswählen. Für x >>= 1 Wäre dies:

10111001
--------
01011100

Und für die Linksverschiebung x <<= 1 Wäre es:

10111001
--------
01110010

Bitte beachten Sie den Hinweis des Benutzers "dasblinkenlight" zu den Schichten.

11
stackomatiker

Es ist ähnlich wie x = (x >> 1).

(operand1)(operator)=(operand2)  implies(=>)  (operand1)=(operand1)(operator)(operand2) 

Es verschiebt den Binärwert von x um eins nach rechts.

Z.B.

int x=3;    // binary form (011) 
x = x >> 1; // zero shifted in from the left, 1 shifted out to the right:
            // x=1, binary form (001)
3
Satyendra Yadav

x & 1 erzeugt einen Wert, der entweder 1 oder 0 ist, abhängig vom niedrigstwertigen Bit von x: Wenn das letzte Bit 1 ist, ist das Ergebnis von x & 1 1; Andernfalls ist es 0. Dies ist eine bitweise UND-Operation.

x >> = 1 bedeutet "setze x auf sich selbst um ein Bit nach rechts verschoben". Der Ausdruck wird nach der Verschiebung auf den neuen Wert von x ausgewertet.

Hinweis: Der Wert des höchstwertigen Bits nach der Verschiebung ist Null für Werte ohne Vorzeichen. Bei Werten des Typs mit Vorzeichen wird das höchstwertige Bit aus dem Vorzeichenbit des Werts vor dem Verschieben als Teil der Vorzeichenerweiterung kopiert, sodass die Schleife niemals beendet wird, wenn x ein vorzeichenbehafteter Typ ist und der Anfangswert negativ ist.

1
SACHIN DUHAN