我理解按位操作,以及它们如何用于不同的目的,例如权限。然而,我似乎不理解位移位运算符的用途。我知道它们是如何工作的,但我想不出任何场景,除非我想要做一些非常快速的乘法或除法。还有没有其他使用位移位的原因?
发布于 2010-09-12 07:08:46
原因有很多,下面是一些:
假设你将一个黑白图像表示为一个位序列,并且你想要在这个图像中设置一个像素。例如,字节偏移量可能是字节,位偏移量可能是x& 0x7,您可以通过以下方式设置该位: x>>3 = byte | (1 << (x & 0x7));
由于这些和其他原因,大多数处理器具有位移位和/或旋转指令以及其他逻辑指令(与/或/异或/非)。
从历史上看,乘法和除法的速度要慢得多,因为它们是更复杂的操作,而且一些CPU根本没有这些功能。
也可以在这里看到:Have you ever had to use bit shifting in real projects?
发布于 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的倍数要方便得多。
因此,虽然移位而不是乘法通常不会带来性能上的好处--至少在使用高级语言时不会--但有时候,拥有移位的能力会让你所做的事情更容易理解。
发布于 2010-09-12 07:15:59
https://stackoverflow.com/questions/3692992
复制相似问题