如何从这些位移实践问题中得到像-10
这样的数字?
据我所知,X*32
可以写成x<<5
。但是,如何获得x*66
或X*(-10)
等数字?
答案 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
来避免符号扩展意外。