你是否曾经在实际编程项目中使用过 位移操作?大多数(如果不是全部)高级语言都有这种操作符,但是什么情况下才需要使用它们呢?
我仍然为没有硬件浮点支持的系统编写代码。在这些系统中,几乎所有的算术运算都需要使用位移。
此外,您需要使用位移来生成哈希值。多项式算术(CRC、Reed-Solomon Codes是主流应用)也使用位移。
然而,仅仅因为它们方便且能够精确地表达作者的意图才使用了位移。如果你想的话,你可以通过乘法来模拟所有的位移操作,但那会更难写,不易读,并且有时还会更慢。
编译器会检测到可以将乘法转换为位移的情况。
是的,我经常使用它们。在嵌入式硬件上,位掩码非常常见,因此位操作很重要。在游戏编程中,当您需要尽可能地提高性能时,位操作也很重要。
编辑: 此外,我经常使用它们来操纵位图,例如更改颜色深度或转换RGB<->BGR。
我想不出有多少情况会使用它们。通常情况下,问题是特定的,而采用位运算将产生最佳结果(通常是在时间和/或空间性能方面)。
我经常使用它们的其中一个场合是在为跨平台应用程序转换整数的字节序时。它们有时还会与其他位操作符一起用于2D图形处理中。
我已经使用过它们几次,但基本上都是用于解析二进制文件格式。
位移操作是快速的。在除法和取模运算之前,它们就已经被实现在CPU指令集中了。许多人用位移操作来进行像在纸上计算器上简单的算术运算,但这些算术运算在我们的CPU上不可用。
例如:
是的,仍然需要。
例如,在我的工作中,我们开发软件通过串口COMx与PLC通信。必须处理字节内的位,我们每天都使用左/右移位和逻辑运算符OR、XOR、AND。
例如,假设我们需要打开一个字节中从右往左数第3个位:
00001001 -> 00001101
使用以下方法更加高效:
Byte B;
B := B OR 4; //100
改为:
Byte B = 0;
String s; // 0 based index
s = ConvertToBinary (B);
s[5] = "1";
B := ConvertToDecimal (s);
致敬。
没错。我之前必须编写加密算法,这绝对会用到它们。
当使用整数等来跟踪状态时,它们也非常有用。