使用Shift运算符而不是使用除法和乘法的目的是什么?
使用移位运营商还有其他好处吗?
应该在哪里尝试使用移位运算符?
我理解按位操作以及它们如何用于不同目的,例如权限.但是,我似乎不明白比特移位运算符的用途.我理解他们是如何工作的,但我想不出任何我可能想要使用它们的场景,除非我想做一些非常快速的乘法或除法.有没有其他理由使用位移?
我完全理解如何移位。我已经在纸上和代码中完成了许多示例,并且不需要任何帮助。
我正在尝试提出一些有关如何使用位移的真实示例。以下是我能想到的一些例子:
也许我能概念化的最重要的例子与字节序有关。在大端系统中,最低有效位从左侧存储,而在小端系统中,最低有效位从右侧存储。我想对于使用相反字节序策略的系统之间的文件和网络传输,必须进行某些转换。
在处理任何 n^2、n^4 等乘法时,编译器和处理器似乎可以进行某些优化。这些位只是向左移动。(相反,我想同样适用于除法、n/2、n/4 等)
在加密算法中。即使用一系列位移、反转和组合来混淆某些东西。
所有这些都是准确的例子吗?你有什么要补充的吗?我花了很多时间学习如何实现位移/重新排序/字节交换,我想知道如何实际应用它 = )
我偶然发现了一个问题,询问你是否曾经不得不在实际项目中使用位移.我在许多项目中都使用了相当广泛的位移,但是,我从来不必使用算术位移,即位移,其中左操作数可能是负的,符号位应该移位而不是零.例如,在Java中,您将使用运算>>符进行算术位移(同时>>>执行逻辑移位).在经过深思熟虑之后,我得出的结论是,我从未使用>>过可能为负的左操作数.
正如本回答中所述,算术移位甚至是在C++中定义的实现,因此与Java相比 - 在C++中甚至没有用于执行算术移位的标准化运算符.答案还说明了一个有趣的问题,我甚至都没有意识到负面数字的变化:
+63 >> 1 = +31 (integral part of quotient E1/2E2)
00111111 >> 1 = 00011111
-63 >> 1 = -32
11000001 >> 1 = 11100000
Run Code Online (Sandbox Code Playgroud)
因此,当看到这些位时,-63>>1收益率-32是显而易见的,但也许不是大多数程序员一见钟情的预期.更令人惊讶的是(但在查看位时再次显而易见)-1>>1是-1,不是0.
那么,可能负值算术右移的具体用例是什么?