【问题标题】:Logical left shift of 0逻辑左移 0
【发布时间】:2019-12-11 08:10:45
【问题描述】:

我的问题是为什么逻辑左移 0 是 1。 1

根据定义,逻辑左移通过将位向左移动 n 位来工作。

逻辑左移的工作原理是将数字乘以 2 n

即使 0 或负数存储在二进制补码中,所以对于 0,所有位都必须为 1,那么它的逻辑左移是如何工作的。

1<<0 =1         1<<2=4
2<<0 =2         2<<2=8
3<<0 =3         3<<2=12

【问题讨论】:

    标签: logical-operators bit-shift


    【解决方案1】:

    向左位移将右侧数字乘以左侧的 2 次方。例如:1 &lt;&lt; 21 * 2^2 相同(其中^ 表示指数,而不是 XOR)。

    二进制中的 1 是 0001,然后将其位移 0 不会做任何事情,这与您观察到的一致。

    所以任何数字x &lt;&lt; 0 等价于x * 2^0,也就是x * 1,也就是x

    【讨论】:

    • 感谢您的澄清。您能否再解决一个关于 -1 的逻辑左移的疑问,它是如何计算的。即 1
    • @SoniaBehal 这是未定义的行为,即编译器没有标准方法来解释负移位量。例如,我电脑上的 gcc 说它是零,但 clang 会吐出随机数。它们都打印警告。
    • “左移将右手数乘以 2 到左手边的幂”不是倒过来吗?
    【解决方案2】:

    您认为它是“2 * n”但它是“2^n”,这是一个错误。像 23=6 但 2^3 将是 8。其次,如果你有 0001 并且你正在移动 0 位,那么它不会影响,因为 2^0=1 和 11 将是1.但如果你移动1位,它将乘以“2”。例如,0001 并且您移动了 1 位。它变成了 0010,即 2。

    【讨论】:

      猜你喜欢
      • 2020-07-22
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多