This Frage gibt Erklärung über SWAR algorithm zum Zählen der Anzahl von 1s in einer bestimmten Anzahl verwendet. Während Erläuterung ilmari schrieben 0x01010101 = (1 < < 24) + (1 < < 16) + (1 < < 8) + 1. Kann jemand erklären, wie es gleich ist?Wie 0x01010101 entspricht 1 << 24 + 1 << 16 + 1 << 8 + 1
Antwort
Sie müssen zuerst verstehen, was der Operator <<
tut. Es führt eine bitweise Verschiebung nach links durch. Lassen Sie uns das 0b
Präfix für binäre Notation und 0x
für hexadezimale Schreibweise annehmen:
1 << 8 = 0b100000000 = 256 = 0x100
Ähnlich:
1 << 16 = 0b10000000000000000 = 65536 = 0x10000
So:
(1 << 8) + (1 << 16) = 0x10100
Durch das Hinzufügen (1 << 24)
und 1
, erhalten Sie die Endergebnis: 0x01010101
.
Bitte beachten Sie, dass es, obwohl es sehr viel wie ein Binärwert aussieht, ist es eine hexadezimale. Wenn wir es als binär schreiben, erhalten wir:
0b1000000010000000100000001
^ ^ ^ ^
bit #24 bit #16 bit #8 bit #0
1 0000 0000 0000 0000 0000 0000 Shifting 1 left by 24 places
1 0000 0000 0000 0000 Shifting 1 left by 16 places
1 0000 0000 Shifting 1 left by 8 places
1
================================
1 0000 0001 0000 0001 0000 0001 Result after adding
I.e. 0x01010101.
Beginnen wir mit der Gesamtzahl beginnen:
Hex: 0x01010101
Decimal: 16843009
Binary: 1000000010000000100000001
nun auf sie einzeln betrachten. Beginnen Sie mit 1 << 24
(aka 1 left shifted 24-mal, auch bekannt als eine binäre 1 mit 24 Nullen..):
Calculation: 1 << 24
Decimal: 16777216
Binary: 1000000000000000000000000
// ^25th position because 1 was shifted 24 times to the left
Calculation: 1 << 16
Decimal: 65536
Binary: 0000000010000000000000000
// ^17th position because 1 was shifted 16 times to the left
Calculation: 1 << 8
Decimal: 256
Binary: 0000000000000000100000000
// ^9th position because 1 was shifted 8 times to the left
1 offensichtlich ist, so will ich nicht gehören. Nun fügen sie alle zusammen:
1000000000000000000000000 = 1 << 24
0000000010000000000000000 = 1 << 16
0000000000000000100000000 = 1 << 8
+ 0000000000000000000000001 = 1
|-------|-------|-------|
1000000010000000100000001 = 16843009
Und dann sind wir am Anfang zurück, 16843009
in hex ist 0x01010101
.