移位的目的是啥? [关闭]

Posted

技术标签:

【中文标题】移位的目的是啥? [关闭]【英文标题】:what is the purpose of bit shifting? [closed]移位的目的是什么? [关闭] 【发布时间】:2012-06-17 14:50:52 【问题描述】:

我在代码中遇到了以下几行

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.

我知道它是移位的,但我不知道它有什么用途以及何时应该使用它?

【问题讨论】:

如果它对你没有任何意义,那就没有意义了。忽略代码即可。 这个问题太笼统了;没有答案。添加的目的是什么?这是一个手术。 是的,这对我来说并不重要,但我认为我应该知道它! 在我看来,这是一个有效的问题。请关闭它,但出于其他更相关的原因,而不是将其宣布为“不是一个真正的问题”。问候, 谢天谢地,有人在答案关闭之前挤进了答案 【参考方案1】:

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

举一个明显的例子,考虑一个 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 的幂的乘法或除法,但对于现代硬件和编译器,这通常是浪费时间。您将在现有代码中看到它,并且应该理解它试图完成的任务——但不要试图模仿它的示例。

【讨论】:

有人说使用移位比普通方式快一点?对吗? @Kingfisher:正常的方式是什么?如果您的意思是移位与乘法/除法,是的,移位指令可能比 mul/div 指令更快——但如果是这样,大多数编译器相当能够执行该操作为您优化。 我读错了吗,还是第一个代码示例(如所写)实际上是针对 AABBGGRR 而不是 AARRGGBB? @MonteHurd:我认为根本不足以说它是颜色。 完全正确 - 如果有人使用该示例来测试他们对位移的理解(无论颜色如何,仅使用“a、“r”、“g”和“b”来表示相对字节位置)编写的代码适用于 AABBGGRR,而不是 AARRGGBB。【参考方案2】:

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

........
...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)。

这样会不会更清楚一点?

【讨论】:

+1 用于单色精灵滚动。现在我们真的暴露了我们的年龄。 从来没有想过这个。这一定很流行。 谢谢!真的很有帮助!【参考方案3】:

位移有多种用途

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

【讨论】:

弱加密形式,真的吗? @Hasturkun:99% 的首次尝试编写密码都比 XOR 弱。 @leppie:这是一种误导,因为位移也用于所有常见的强加密算法,例如 DES 和 AES。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

快吗?与常规算术相反还是什么? @LuchianGrigore 在我的第一份工作中学习 C++ 时,我的导师告诉我,它实际上比将代码编写为显式除以 2 更快。当时我没有理由不相信他。如果这实际上不是真的,那么我谦卑地接受纠正。 这样的话,我会建议我的前老板立即减薪。 看到这个 - ***.com/questions/6357038/… @LuchianGrigore 感谢您的链接。我只是一直认为它更快。无论如何,我现在已经编辑了答案,以消除它更快的暗示。

以上是关于移位的目的是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 System.out.println() 的目的是啥 [关闭]

编译css/scss的目的是啥? [关闭]

sudo bang bang 到底是啥? [关闭]

java web 应用程序的最佳托管是啥? [关闭]

作为开发人员,最好的安卓手机是啥[关闭]

Jade 和 EJS 对于 Node.js 模板的优缺点是啥? [关闭]