您是否曾经在实际编程项目中使用位移?大多数(如果不是全部)高级语言都有移位运算符,但什么时候你真的需要使用它们?
我仍然为没有硬件浮点支持的系统编写代码.在这些系统中,几乎所有算术都需要进行位移.
您还需要轮班以生成哈希值.多项式算术(CRC,Reed-Solomon码是主流应用)或使用移位.
然而,只是使用轮班,因为它们很方便,并且完全表达了作者的意图.如果需要,可以使用乘法模拟所有位移,但这样写起来会更难,可读性更低,有时更慢.
编译器检测乘法可以减少到一个班次的情况.
是的,我已经使用了很多次.在位掩码很常见的嵌入式硬件上,位错误非常重要.当你需要最后一点性能时,它在游戏编程中也很重要.
编辑:另外,我使用它们来操作位图,例如改变颜色深度,或转换RGB < - > BGR.
为枚举创建漂亮的标志值(而不是手动输入1,2,4 ......)
从位字段解包数据(许多网络协议使用它们)
Z曲线遍历
性能黑客
当他们被使用时,我想不到很多情况.它通常是另一种方式 - 存在一些特定问题,并且结果是采用位操作将产生最佳结果(通常在性能方面 - 时间和/或空间).
我一直使用它们的一个地方是将整数的字节序转换为跨平台应用程序.当blitting 2D图形时,它们有时也会派上用场(与其他位操作操作符一起使用).
我已经使用了几次,但几乎总是用于解析二进制文件格式.
这里有合理的文章:http://greatjustice.info/the-lost-art-of-bitmasks/
位移很快.它们在分割和模数运算之前很久就在CPU指令集中实现.我们中的许多人使用位移算术,这在铅笔和纸上很简单,但在我们的CPU上不可用.
例如:
我使用位移来处理涉及将大型复合材料纳入其主要因素的项目.
我还使用位移来寻找任意大整数的平方和立方根.
是的,仍然需要它.
以我的工作为例,我们开发了通过串口COMx与PLC通信的软件.有必要处理一个字节内的位,我们使用左/右移位,逻辑运算符OR,XOR,AND日复一日.
例如,假设我们需要打开一个字节的第3位(从右到左):
这样做效率更高:
Byte B; B := B XOR 4;
代替:
Byte B = 0; String s; // 0 based index s = ConvertToBinary (B); s[5] = "1"; B := ConvertToDecimal (s);
问候.