bit-manipulation - 除了快速数学运算之外,是否有充分的理由使用移位?

标签 bit-manipulation bit-shift

我了解按位运算以及它们对于不同目的的有用性,例如权限。但是,我似乎并不了解位移运算符的用途。我知道它们是如何工作的,但是除非我想进行一些非常快速的乘法或除法,否则我无法想到任何可能需要使用它们的情况。还有其他使用移位的理由吗?

最佳答案

原因有很多,以下是一些原因:

  • 假设您将黑白图像表示为一系列位,并且希望在该图像中设置一个像素。例如,您的字节偏移量可能是x >> 3,而您的位偏移量可能是x&0x7,则可以通过以下方式设置该位: (1 <<(x&0x7));
  • 实现数据压缩算法,在其中处理可变长度的位序列,例如霍夫曼编码。
  • 您正在与某些硬件进行交互,例如串行通信设备,则需要读取或设置一些控制位。

  • 由于这些和其他原因,大多数处理器具有移位和/或旋转指令以及其他逻辑指令(和/或/或/非)。

    从历史上看,乘法和除法的运算速度很慢,因为它们是更复杂的运算,而某些CPU根本没有运算法则。

    另请参阅此处:
    Have you ever had to use bit shifting in real projects?

    关于bit-manipulation - 除了快速数学运算之外,是否有充分的理由使用移位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3692992/

    相关文章:

    c++ - 从内存 C++ 中读取位,移位并存储

    java - 使用移位运算符理解 java 数组初始化

    c# - 检查字节是否为 0x00

    c - Unsigned/Signed Arthmetic Problems from A Programmer's Perspective 教科书

    compiler-errors - 如何解决移位运算符语法错误?

    go - 无效操作 : shift of type float64

    c++ - "int mask = ~0;"的目的是什么?

    JavaScript 按位运算

    gcc - shrl 与 sarl .. x86 汇编 gnu

    c - 如何使用按位运算符连接 2 个数字,同时保持变量的初始值不变?