关于C#:为什么1<<3=8而不是6

Why is 1 << 3 equal to 8 and not 6?

本问题已经有最佳答案,请猛点这里访问。

C中,我有这个enum

1
2
3
4
5
6
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,二进制的500000101,也就是说。

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&8594;b00000001 << 3&8594;b00001000&8594;23->8

如果你改为这样做,那么

3 << 1&8594;b00000011 << 1&8594;b00000110&8594;22+21&8594;4+2&8594;6


二进制中的1是0000 0001

通过向左移动3位(即1 << 3位),可以得到

1
0000 1000

小数点后8位而不是6位。


用二进制思维。你真的这么做了。0001向左移动3次=1000=8


因为二加三等于八。