首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除了快速计算之外,还有什么好的理由可以使用位移位吗?

问除了快速计算之外,还有什么好的理由可以使用位移位吗?
EN

Stack Overflow用户
提问于 2010-09-12 06:53:30
回答 4查看 5.2K关注 0票数 10

我理解按位操作,以及它们如何用于不同的目的,例如权限。然而,我似乎不理解位移位运算符的用途。我知道它们是如何工作的,但我想不出任何场景,除非我想要做一些非常快速的乘法或除法。还有没有其他使用位移位的原因?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-12 07:08:46

原因有很多,下面是一些:

假设你将一个黑白图像表示为一个位序列,并且你想要在这个图像中设置一个像素。例如,字节偏移量可能是字节,位偏移量可能是x& 0x7,您可以通过以下方式设置该位: x>>3 = byte | (1 << (x & 0x7));

  • Implementing数据压缩算法,其中您处理可变长度的位序列,例如霍夫曼编码。

  • 您正在与某些硬件交互,例如串行通信设备,您需要读取或设置一些控制位。

由于这些和其他原因,大多数处理器具有位移位和/或旋转指令以及其他逻辑指令(与/或/异或/非)。

从历史上看,乘法和除法的速度要慢得多,因为它们是更复杂的操作,而且一些CPU根本没有这些功能。

也可以在这里看到:Have you ever had to use bit shifting in real projects?

票数 15
EN

Stack Overflow用户

发布于 2010-09-12 07:08:13

正如您所指出的,左移与2的乘法是一样的。至少当我们讨论无符号数量时是这样的。一个有符号数量的“左移”的意思是...依赖于语言。

对于现代编译器,编写"i = x*2;“和"i =x << 1”实际上没有区别;编译器将生成最高效的代码。因此,在这种意义上,没有理由更喜欢移位而不是乘法。

一些算法的工作原理是将一个量左移一位,然后将低位设置为0或1。一些简单的压缩算法就是这样工作的。例如,如果累加值在变量x中,而当前值(0或1)在y中,那么写"x = (x << 1) | y“比写"x = (x * 2) + y”更有意义。这两种方法都做同样的事情,但前者在符号上更正确。你不必想,“哦,对了,乘以2和左移是一样的。”

此外,当你讨论移位的算法时,向左或向右移动特定数量的位比计算出想要乘以或除以的2的倍数要方便得多。

因此,虽然移位而不是乘法通常不会带来性能上的好处--至少在使用高级语言时不会--但有时候,拥有移位的能力会让你所做的事情更容易理解。

票数 7
EN

Stack Overflow用户

发布于 2010-09-12 07:15:59

除了在数值计算中使用位移位操作之外,还有很多地方经常使用位移位操作。例如,Bitboard是通常在棋盘游戏中用于棋盘表示的数据结构。一些最强大的国际象棋引擎使用这种数据结构,主要是为了速度和移动生成和评估的简易性。这些程序大量使用位操作,位移位操作特别用于许多上下文中-例如查找位掩码,在板上生成新的移动,非常快速地计算对数等。甚至还有非常高级的数值计算,可以通过巧妙地使用位操作来完成。查看this site了解位旋转技巧--其中很多算法都使用了移位运算符。位移位操作常用于设备驱动程序设计、编解码器开发、嵌入式系统编程等。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3692992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档