【问题标题】:Why is 1 << 3 equal to 8 and not 6? [duplicate]为什么 1 << 3 等于 8 而不是 6? [复制]
【发布时间】:2015-04-08 09:07:49
【问题描述】:

C 我有这个enum

enum {
    STAR_NONE =     1 << 0, // 1
    STAR_ONE =      1 << 1, // 2
    STAR_TWO =      1 << 2, // 4
    STAR_THREE =    1 << 3  // 8
};

为什么1 &lt;&lt; 3 等于 8 而不是 6?

【问题讨论】:

  • 为什么1 &lt;&lt; 2 等于 4 而不是 3?
  • 你在那个位移计算器网站输入3 &lt;&lt; 1,而不是1 &lt;&lt; 3
  • 将数字左移 x 位只不过是将数字乘以 (2^x),右移 x 位就是除以 (2^x)!附加信息:这就是为什么多次使用位移而不是乘法和除法来加快运算速度的原因!
  • @Swanand 这个公式让一切变得清晰一千倍,谢谢
  • @YassineHoussni:你是对的;确实如此;) 最好研究了解事物的作用,而不是疯狂猜测。

标签: c bit-shift


【解决方案1】:

因为二的三的幂是八。

【讨论】:

    【解决方案2】:

    将数字向左移动相当于将该数字乘以 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 &lt;&lt; 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 &lt;&lt; 2等价于5×22的结论,一般可以证明

    k m

    所以在你的情况下1 &lt;&lt; 3 相当于 23 = 8,因为

    1 &lt;&lt; 3b00000001 &lt;&lt; 3b00001000 → 23 -> 8

    如果您改为这样做 3 &lt;&lt; 1 然后

    3 &lt;&lt; 1b00000011 &lt;&lt; 1b00000110 → 22 + 21 → 4 + 2 → 6

    【讨论】:

    • 有时terseness 胜过完整性 - 就像您的完整答案一样。
    • @chux 这次不行。感谢 iharob 的回答,这正是我需要清楚地了解换档。
    【解决方案3】:

    二进制中的1是0000 0001

    通过向左移动 3 位(即1 &lt;&lt; 3)你得到

    0000 1000
    

    十进制是 8 而不是 6。

    【讨论】:

    • 谢谢,我刚开始学习位移位!
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      • 2020-09-23
      相关资源
      最近更新 更多