位移的目的是什么?

时间:2012-06-17 14:50:53

标签: c++ c

我在代码

中遇到了以下行
unsigned char A = 0xB9; 
unsigned char B = 0x91; 
unsigned char C = A << 3; // shift bits in A three bits to the left. 
unsigned char D = B >> 2; // shift bits in B two bits to the right.

我知道它有点变化,但我不知道它的用途是什么,何时应该使用它?

6 个答案:

答案 0 :(得分:18)

主要用途是当您根据特定位定义较大项目的某些部分时。

对于一个明显的例子,考虑一个32位数字,一个颜色 - 红色,绿色和蓝色各8位,以及(可能)alpha的其他8位(表示这种颜色/像素的透明度应该是多少)是)。在十六进制中,数字看起来像:

AARRGGBB
每个组件的

(即两位数,或8位)。

我们可以把这样的东西分解成类似的东西:

red = color & 0xff;
green = (color >> 8) & 0xff;
blue = (color >> 16> & 0xff;
alpha = (color >> 24) & 0xff;

相反,我们可以将组件放在一起:

color = (alpha << 24) | (blue << 16) | (green << 8) | red;

在处理硬件时,你通常也会像这样做一点点蠢蠢欲动。例如,您可能有一个16位寄存器,它将5位专用于一个,另外2位专用于其他内容,6位到三分之一,依此类推。当/如果你想改变其中一个时,就像上面的颜色示例一样:隔离代表一个字段的位,根据需要进行修改,然后将它们与其他位一起放回。

另一个(非常不相关)应用程序就像哈希这样的东西。这里我们通常没有这样的字段,但是我们想要一些输入字节来产生单个输出,输出的所有位至少在一定程度上受到输入字节的影响。为了实现这一目标,大多数最终都会移位,因此每个输入字节至少有一定几率影响结果的不同部分。

我补充一点,虽然相当多的旧代码使用位移来优化乘法或除以2的幂,但这通常浪费现代硬件和编译器的时间。您将在现有代码中看到它,并且应该理解它正在尝试完成的内容 - 但不要试图模仿它的示例。

答案 1 :(得分:8)

一个例子是(单色)位图,其中每个像素由一个比特表示 假设你有一个圆圈

........
...oo...
..O..O..
.O....O.
.O....O.
..O..O..
...oo...
........

其中.由0位表示,O由1位表示,因此第二行由二进制00011000或十进制24表示。现在,如果要移动圆圈右边1个像素,你要做的是将其表示中的位向右移1位。

........
....oo..
...O..O.
..O....O
..O....O
...O..O.
....oo..
........

所以第二行现在是转移后的00001100,(或十进制12)。

这会让它更清晰吗?

答案 2 :(得分:4)

比特移位有几个目的

  • 乘以或以两个权力划分
  • 通过查找上溢或下溢来检查是设置了最高有效位(MSB还是LSB)
  • 弱加密形式

答案 3 :(得分:0)

一种用法是除以2的整数幂除法。

答案 4 :(得分:0)

位移或位模式用于压缩文件。有些人也将它用于加密。

答案 5 :(得分:0)

转移有很多用途。这里可以解释现实。一个很好的例子是在汇编代码时将值转移到正确的位置。左移1也与将值乘以2相同,但速度要快得多。同样,右移与除以2相同。