位移的目的是什么?

Kin*_*uoc 2 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.
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*fin 18

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

举一个明显的例子,考虑一个32位数字,颜色为 - 红色,绿色和蓝色各8位,以及(可能)alpha的其他8位(表示此颜色/像素的透明度).在十六进制中,数字看起来像:

AARRGGBB
Run Code Online (Sandbox Code Playgroud)

(即,每个组件的两位数或8位).

我们可以把这样的事情分解成以下组件:

red = color & 0xff;
green = (color >> 8) & 0xff;
blue = (color >> 16> & 0xff;
alpha = (color >> 24) & 0xff;
Run Code Online (Sandbox Code Playgroud)

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

color = (alpha << 24) | (blue << 16) | (green << 8) | red;
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @Kingfisher:正常的方式是什么?如果你的意思是位移与乘法/除法,是的,位移指令可能比mul/div指令更快 - 但是当这样时,大多数编译器都*能够为你执行优化. (2认同)
  • 确切地说 - 如果有人使用该示例来测试他们对位移的理解(无论颜色如何,仅对相对字节位置使用"a","r","g"和"b"),所写的代码适用于AABBGGRR,不是AARRGGBB. (2认同)

Mr *_*ter 8

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

........
...oo...
..O..O..
.O....O.
.O....O.
..O..O..
...oo...
........
Run Code Online (Sandbox Code Playgroud)

其中a .由0位和O1位表示,因此第二行由二进制00011000或十进制24表示.现在,如果要将圆圈1像素向右移动,您要做的是移位在它的表示中向右1位.

........
....oo..
...O..O.
..O....O
..O....O
...O..O.
....oo..
........
Run Code Online (Sandbox Code Playgroud)

所以第二行现在是00001100,之后是移位(或十进制12).

这会让它更清晰吗?

  • +1 用于单色精灵滚动。现在我们真的暴露了我们的年龄。 (3认同)

Stu*_*tLC 5

位移位有几个目的

  • 乘以或除以二的幂
  • 通过查找上溢或下溢来检查是否设置了最高或最低有效位(MSB 或 LSB)
  • 弱加密形式

  • 弱加密,真的吗? (4认同)