0

是否有简单的方法来确定有符号数的左移或右移输出? 页面将左移描述为expr1*2*expr2,将右移描述为expr1/2*expr2,但是当我在 CI 中尝试类似的操作时27 << 5,得到的值大于27*2*5 = 270。此外,对于负输入,例如-27 << 4or -120 >> 5,这些操作如何工作?在轮班工作时是否需要考虑特殊情况?

4

2 回答 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 回答