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.
我知道它是位移,但它有什么作用,什么时候应该使用它呢?
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.
我知道它是位移,但它有什么作用,什么时候应该使用它呢?
主要用途是当您使用特定位来定义较大项目的某个部分时。
以一个明显的例子为例,考虑一个32位数字,它保存颜色——每个颜色通道8位,分别对应红、绿、蓝色,另外8位则可能表示alpha值(指示此颜色/像素的透明度)。在十六进制下,这些数字看起来像:
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的幂次方,但这对于现代硬件和编译器通常是浪费时间的。你会在现有代码中看到它,并应该理解它试图实现什么 - 但不要试图效仿它的示例。
一个例子是单色位图,其中每个像素由一个单独的比特表示。假设你有一个圆形。
........
...oo...
..O..O..
.O....O.
.O....O.
..O..O..
...oo...
........
假设一个 .
用一个 0 位表示,而一个 O
则用一个 1 位表示,因此第二行的二进制表示为000110000,或者十进制表示为24。现在如果你想将圆形向右移动1像素,你需要将其表示中的位向右移动1位。
........
....oo..
...O..O.
..O....O
..O....O
...O..O.
....oo..
........
所以经过移位后,第二行现在是00001100(或十进制数12)。位移具有几个用途
其中一个用途是通过整数次幂的2进行除法或乘法。
位移或位模式用于压缩文件。有些人也用它进行加密。
移位有很多用途,远远超出了此处可以解释的范围。一个很好的例子是在组装代码时将值移动到正确的位置。同时,左移1位相当于将值乘以2,只是速度更快。同样地,右移相当于除以2。