为什么1 << 3等于8而不是6?

h0u*_*sni 0 c bit-shift

C我有这样的enum:

enum {
    STAR_NONE =     1 << 0, // 1
    STAR_ONE =      1 << 1, // 2
    STAR_TWO =      1 << 2, // 4
    STAR_THREE =    1 << 3  // 8
};
Run Code Online (Sandbox Code Playgroud)

为什么1 << 3等于8而不是6?

Iha*_*imi 8

向左移动数字相当于将该数字乘以2 n,其中n是您移动该数字的距离.

为了看看这是如何真实让我们举一个例子,假设我们有数字,5所以我们把它2移到左边,5二进制是00000101ie

0×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 1×2 2 + 0×2 1 + 1×2 0 = 1×2 2 + 1×2 0 = 4 + 1 = 5

现在,5 << 200010100

0×2 7 + 0×2 6 + 0×2 5 + 1×2 4 + 0×2 3 + 1×2 2 + 0×2 1 + 0×2 0 = 1×2 4 + 1×2 2 = 16 + 4 = 20

但我们可以写1×2 4 + 1×2 2作为

1×2 4 + 1×2 2 =(1×2 2 + 1×2 0)×2 2 = 5×4→20

由此可以得出结论,5 << 2相当于5×2 2,一般可以证明这一点

k << m = k×2 m

所以在你的情况下1 << 3相当于2 3 = 8,因为

1 << 3→交通b00000001 << 3→交通b00001000→交通2 3 - > 8

如果不是这样做3 << 1,然后

3 << 1b00000011 << 1b00000110→2 2 + 2 1 →4 + 2→6