位移x *一个数字

时间:2016-03-03 02:54:55

标签: c binary bitwise-operators bit-shift

如何从这些位移实践问题中得到像-10这样的数字?

据我所知,X*32可以写成x<<5。但是,如何获得x*66X*(-10)等数字?

1 个答案:

答案 0 :(得分:3)

一般说明

比特移位主要是为了移动数字的二进制表示。乘法

23 = 0001 0111
23 << 1 = 0001 0111 << 1 = 0010 1110 = 46
  

然而,随着数字的二进制表示改变,   它代表的数字也改变了。这就是计算机二进制系统的工作原理。因此人们有时会利用这种行为作为&#34; hack&#34;,主要是为了加快计算时间。

让我们更多地了解它:

左移位和右移位

现在,当代表的数字为integer类型时,将数字的二进制表示形式转换为将等效于乘以它由2:

23 = 0001 0111
23 << 1 = 0001 0111 << 1 = 0010 1110 = 46 //left bit-shift by 1, number becomes doubled

鉴于给定数据类型存在无溢出

255 = 1111 1111 //assuming 8-bit data type
255 << 1 = 1111 1111 << 1 = 1111 1110 = 254 //not multiplied by 2, because of overflow

将整数转换为将等同于除以2,然后将其舍入

23 = 0001 0111
23 >> 1 = 0001 0111 >> 1 = 000 1011 = 11 //right bit-shift by 1, number becomes halved, rounded down

有些使用并链接到乘法和除法

由于位移操作通常比乘法成本更低,为了加快速度,你会发现在某些程序中,人们使用左位移操作(作为乘法的替代),当它们意味着乘以{{ 1}}(即2,4,8,16等):

an integer number of power of 2

或使用正确的位移操作(作为除法和舍入的替代)将其除以int a = 23; ... a = a << 2; //=102; multiply by 4, equivalent to a = a * 4, but faster operation (即2,4,8,16等)

an integer number of power of 2

结束语

请注意,只有使用幂为2的数字进行操作时,上面的所有乘法和除法都可以用左移位或右移位替换。

在你的例子中,66和-10不是2的幂的整数,因此你不能&#34; hack&#34;使用二进制移位操作进行乘法/除法。

一般情况下,如果你的意思是位移,则使用位移操作,因为位移具有许多其他用途而不仅仅是&#34; hacking&#34;乘法/除法,整数次幂为2.如果要乘法或除法,请使用乘法(int a = 23; ... a = a >> 2; //=5; divide by 4 and rounding down, equivalent to integer division a = a / 4, but faster )或除法(*)运算符。

其他一些评论:

话虽这么说,我只想补充一些关于位移的事情,以便进一步解释(它不会造成伤害):

  • 签名/类型可以包含正或负数字
  • 处理负数时,逻辑位移和算术位移之间存在差异。一个人在转移后会在空旷的空间中提供integer,而另一个人会给0
  • 因此,最好注意位移主要用于1类型,例如通过位移创建位掩码。也就是说,当您处理负数(右)位移时,建议使用unsigned来避免符号扩展意外。