我在代码
中遇到了以下行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.
我知道它有点变化,但我不知道它的用途是什么,何时应该使用它?
答案 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)
比特移位有几个目的
答案 3 :(得分:0)
一种用法是除以2的整数幂除法。
答案 4 :(得分:0)
位移或位模式用于压缩文件。有些人也将它用于加密。
答案 5 :(得分:0)
转移有很多用途。这里可以解释现实。一个很好的例子是在汇编代码时将值转移到正确的位置。左移1也与将值乘以2相同,但速度要快得多。同样,右移与除以2相同。