你是否曾经在实际编程项目中使用过 位移操作?大多数(如果不是全部)高级语言都有这种操作符,但是什么情况下才需要使用它们呢?
当与“低级”设备通信时,例如数字以太网-IO盒子或PLC时,位移也是必需的,这些设备通常将单个输入/输出值打包成字节。
是的,在低级嵌入式软件中经常使用位移操作。它也可以作为一种近乎神奇的技巧,用于执行极快的数学运算,请看
http://betterexplained.com/articles/understanding-quakes-fast-inverse-square-root/
我在C#中进行了一些位移操作。该应用程序需要对语音音频输入进行归一化处理,这需要在音频样本级别上进行多个数学运算。
是的。特别是在使用控制和状态字节作为硬件驱动程序的仿真器中。控制字节中的每个位都有特殊含义,状态字节中的每个位也都有特殊含义。
我已经使用它来实现UTF-8和UTF-32之间的转换。
大多数数据包仍然是位编码的。如果您使用任何类型的低级网络通信,您将不得不处理位。
此外,分析包含声音和视频的数据包--我相信甚至MP3标签也使用了一些位。
最重要的是,不熟悉位操作意味着您很可能会错过更好的实现某些操作的方法。我的意思是,如果您正在处理存在5十亿有序对象的情况,这就是能够轻松地将它们全部放入RAM以进行即时查找或每次在文件中查找之间的区别--对于这样的任务,我会说,如果一个自称软件工程师的人没有使用位操作来实现它,那么他的工作能力是不合格的。
我曾经做过一些与新颖的加密结构有关的工作,将序列化结构(以及随后对它们的更新)隐藏在同态加法器后面。许多哈希也依赖于位操作;在它们之间进行移位。
涉及大量的位移和令人讨厌的大数操作;全部都是用Java实现的(诚然,这是一个参考/研究实现)。
还做了压缩项目(特别是GZIP实现),在这种情况下你需要频繁地打包位;无法想象没有 << 和 >>(或者如果你在Java中,则为 >>>)如何完成。
基本上,如果你正在处理加密或压缩,那么很有可能在某个时候需要位移。
不,我从来没有真正需要使用它们。我认为这些二进制操作在高级语言中有点过时了。就像有人说的那样,它总是可以用其他数学表达式模拟,而且由于这些表达式几乎不会被使用,它们可以内置在外部库中。在 Ruby 或 Python 中进行位移听起来对我来说非常奇怪,有点像混合高低级别。