0x01010101如何等于1<<<<<<<<<<<<<<<<<<<<<

时间:2016-08-04 12:58:27

标签: binary

This问题解释了用于计算给定数字中1的数量的SWAR algorithm。虽然解释ilmari写道 0x01010101 =(1 <&lt; 24)+(1 <&lt; 16)+(1 <8)+ 1 。有人可以解释它是如何平等的。

3 个答案:

答案 0 :(得分:2)

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

即。 0x01010101。

答案 1 :(得分:1)

让我们从总数开始:

(*>*)

现在单独看一下。从Hex: 0x01010101 Decimal: 16843009 Binary: 1000000010000000100000001 开始(又名。left shifted 24次,又称。二进制1,有24个零):

1 << 24

1是显而易见的,所以我不会包括那个。现在将它们全部加在一起:

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

然后我们回到开头, 1000000000000000000000000 = 1 << 24 0000000010000000000000000 = 1 << 16 0000000000000000100000000 = 1 << 8 + 0000000000000000000000001 = 1 |-------|-------|-------| 1000000010000000100000001 = 16843009 以十六进制为16843009

答案 2 :(得分:0)

您首先需要了解<<运营商正在做什么。它向左执行按位移位。我们采用0b前缀表示二进制表示法,0x表示十六进制表示法:

1 << 8 = 0b100000000 = 256 = 0x100

类似地:

1 << 16 = 0b10000000000000000 = 65536 = 0x10000

所以:

(1 << 8) + (1 << 16) = 0x10100

通过添加(1 << 24)1,您将获得最终结果:0x01010101

请注意,虽然它看起来很像二进制值,但它是十六进制值。如果我们把它写成二进制,我们得到:

 0b1000000010000000100000001
   ^       ^       ^       ^
bit #24 bit #16  bit #8  bit #0