为什么 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 << 3b00000001 << 3b00001000 → 23 -> 8

如果你这样做 3 << 1 那么

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

1 在二进制中是 0000 0001

通过向左移动 3 位(即 1 << 3)你得到

0000 1000

十进制是 8 而不是 6。

用二进制思考。 你实际上是在这样做。 0001 向左移动 3 次 = 1000 = 8