对“从新手到专业人士的C入门”中使用右移的误解

时间:2019-02-15 17:56:33

标签: c bit-shift

我不确定此右移如何等于0: 我了解移位的工作原理,但是为什么作者说二进制等于零,而十进制却不同?二进制零和十进制零不一样吗?

0000

它怎么也等于二进制零?

  

无符号整数值= 65372U;

     

作为2字节变量中的二进制值,它是:

     

1111 1111 0101 1100

     

假设您现在执行以下语句:

     

无符号整数结果=值>> 2; / *向右移两位* /

     

值的位将向右移动两个位置,从而引入   左端为零,结果值将存储在   结果。二进制形式为0,即十进制值16343。

     

0011 1111 1101 0111

2 个答案:

答案 0 :(得分:1)

您的假设是正确的。二进制0与整数0相同。这本书充其量是错印的,而最坏的情况是普通的。不过,它的示例似乎还可以。

同样,记录中,二进制0是您期望的:

0000 0000 0000 0000

0011 1111 1101 0111不等于0。

答案 1 :(得分:0)

在实践中,位移位实际上是将 N 位移到位,因此移位2:

10101101
||||||
 \\\\\\
  \\\\\\
  vvvvvv
00101011

在数学上,右移一位等于二分之一,而左移则等于二分之一。您有时会看到这种优化,因为移位通常比乘法快得多。

就像用十进制数除以10的任意幂一样简单,您只需删除一定位数或移动小数位即可。