我偶然发现了一个问题,询问您是否曾经在实际项目中使用过位移。我在许多项目中都广泛使用了位移,但是,我从来不必使用算术位移,即左操作数可能为负并且符号位应该移入而不是零的位移。例如,在 Java 中,您将使用运算符进行算术位移>>
(而>>>
将执行逻辑移位)。经过深思熟虑,我得出的结论是,我从未使用>>
过可能为负的左操作数。
正如这个答案中所述,算术移位甚至是在 C++ 中定义的实现,因此 - 与 Java 相比 - C++ 中甚至没有用于执行算术移位的标准化运算符。答案还说明了一个有趣的问题,即我什至不知道的负数移位问题:
+63 >> 1 = +31 (integral part of quotient E1/2E2)
00111111 >> 1 = 00011111
-63 >> 1 = -32
11000001 >> 1 = 11100000
所以-63>>1
产量-32
在查看位时是显而易见的,但可能不是大多数程序员一见钟情。更令人惊讶(但在查看这些位时再次明显)是-1>>1
,-1
不是0
。
那么,可能负值的算术右移的具体用例是什么?