为什么 1 << 3 等于 8 而不是 6?
Why is 1 << 3 equal to 8 and not 6?
在 C
我有这个 enum
:
enum {
STAR_NONE = 1 << 0, // 1
STAR_ONE = 1 << 1, // 2
STAR_TWO = 1 << 2, // 4
STAR_THREE = 1 << 3 // 8
};
为什么 1 << 3
等于 8 而不是 6?
因为二的三次方是八。
向左移动一个数字相当于将该数字乘以 2n,其中 n
是您将该数字移动的距离。
举个例子,假设我们有数字 5
,所以我们将它向左移动 2
位,5
在二进制中是 00000101
即
0×27 + 0×26 + 0×25 + 0×24 + 0×23 + 1×22 + 0×21 + 1×20 = 1×22 + 1×20 = 4 + 1 = 5
现在,5 << 2
将是 00010100
即
0×27 + 0×26 + 0×25 + 1×24 + 0×23 + 1×22 + 0×21 + 0×20 = 1×24 + 1×22 = 16 + 4 = 20
但是我们可以把1×24 + 1×22写成
1×24 + 1×22 = (1×22 + 1×20)×22 = 5×4 → 20
由此可以得出结论5 << 2
等价于5×22,可以证明一般
k << m = k×2m
所以在你的情况下 1 << 3
相当于 23 = 8,因为
1 << 3
→ b00000001 << 3
→ b00001000
→ 23 -> 8
如果你这样做 3 << 1
那么
3 << 1
→ b00000011 << 1
→ b00000110
→ 22 + 21 → 4 + 2 → 6
1 在二进制中是 0000 0001
通过向左移动 3 位(即 1 << 3
)你得到
0000 1000
十进制是 8 而不是 6。
用二进制思考。
你实际上是在这样做。
0001 向左移动 3 次 = 1000 = 8
在 C
我有这个 enum
:
enum {
STAR_NONE = 1 << 0, // 1
STAR_ONE = 1 << 1, // 2
STAR_TWO = 1 << 2, // 4
STAR_THREE = 1 << 3 // 8
};
为什么 1 << 3
等于 8 而不是 6?
因为二的三次方是八。
向左移动一个数字相当于将该数字乘以 2n,其中 n
是您将该数字移动的距离。
举个例子,假设我们有数字 5
,所以我们将它向左移动 2
位,5
在二进制中是 00000101
即
0×27 + 0×26 + 0×25 + 0×24 + 0×23 + 1×22 + 0×21 + 1×20 = 1×22 + 1×20 = 4 + 1 = 5
现在,5 << 2
将是 00010100
即
0×27 + 0×26 + 0×25 + 1×24 + 0×23 + 1×22 + 0×21 + 0×20 = 1×24 + 1×22 = 16 + 4 = 20
但是我们可以把1×24 + 1×22写成
1×24 + 1×22 = (1×22 + 1×20)×22 = 5×4 → 20
由此可以得出结论5 << 2
等价于5×22,可以证明一般
k << m = k×2m
所以在你的情况下 1 << 3
相当于 23 = 8,因为
1 << 3
→ b00000001 << 3
→ b00001000
→ 23 -> 8
如果你这样做 3 << 1
那么
3 << 1
→ b00000011 << 1
→ b00000110
→ 22 + 21 → 4 + 2 → 6
1 在二进制中是 0000 0001
通过向左移动 3 位(即 1 << 3
)你得到
0000 1000
十进制是 8 而不是 6。
用二进制思考。 你实际上是在这样做。 0001 向左移动 3 次 = 1000 = 8