是否有简单的方法来确定有符号数的左移或右移输出? 此页面将左移描述为expr1*2*expr2
,将右移描述为expr1/2*expr2
,但是当我在 CI 中尝试类似的操作时27 << 5
,得到的值大于27*2*5 = 270
。此外,对于负输入,例如-27 << 4
or -120 >> 5
,这些操作如何工作?在轮班工作时是否需要考虑特殊情况?
问问题
92 次
2 回答
3
移位相当于乘以2 的幂,而不仅仅是参数乘积的两倍。换句话说, 27 << 5 == 27 * 2 5。右移等效于下限除法,但没有为负操作数定义。
如果乘以或除以 2 的固定幂,最好用*
or/
运算符写出来。如果可能,编译器会将其转换为更快的移位操作,并且您可以避免围绕负数、操作顺序等的粗糙边缘。
有很多资源可以帮助您深入挖掘(或者确实应该在 MSDN 之前咨询非平台特定问题),例如Wikipedia。
于 2013-01-23T04:27:45.387 回答
1
当您(向左)移动多个二进制位时,它不是移位的乘法。这是乘以2^shift
(2 的移位幂)。
例如
shift multiplier
1 2
2 4
3 8
4 16
右移是相同的,但实际上是一个除法。
所以.. 27 << 5
是这样的:
27 == 00000000 00011011
27 << 5 == 00000011 01100000 == 864
并向右移动:
27 >> 1 == 00000000 00001101 == 13
27 >> 2 == 00000000 00000110 == 6
27 >> 3 == 00000000 00000011 == 3
27 >> 4 == 00000000 00000001 == 1
27 >> 5 == 00000000 00000000 == 0
当你移动负数时,我相信最左边的位通常会被保留。不过我不确定。老实说,我只移动过无符号数字,我个人不相信移动有符号值。
每当您移动时,您都需要注意截断(即会丢失一些位)。通常它只是被截断的零位,但如果你移动得足够多(或者你向右移动)你会丢失 1 位。这取决于您的整数类型的容量,并且绝对可以利用您的优势。
于 2013-01-23T04:29:17.160 回答