为了账号安全,请及时绑定邮箱和手机立即绑定

什么是按位移位(位移)运算符以及它们如何工作?

什么是按位移位(位移)运算符以及它们如何工作?

什么是按位移位(位移)运算符以及它们如何工作?我一直在尝试在业余时间学习C语言,其他语言(C#,Java等)具有相同的概念(通常是相同的运算符)......我想知道是,在核心层,是什么位移(<<,>>,>>>)这样做,可以帮助它什么问题解决,和周围的弯曲什么潜伏的陷阱?换句话说,一个绝对的初学者指导比特移位的所有优点。
查看完整描述

3 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

按位运算(包括位移)是低级硬件或嵌入式编程的基础。如果您阅读了设备规范甚至某些二进制文件格式,您将看到字节,字和dword,分为非字节对齐的位域,其中包含各种感兴趣的值。访问这些位字段以进行读/写是最常见的用法。


图形编程中一个简单的实例是16位像素表示如下:


  bit | 15| 14| 13| 12| 11| 10| 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1  | 0 |

      |       Blue        |         Green         |       Red          |

要获得绿色值,您可以这样做:


 #define GREEN_MASK  0x7E0

 #define GREEN_OFFSET  5


 // Read green

 uint16_t green = (pixel & GREEN_MASK) >> GREEN_OFFSET;

说明


为了获得绿色ONLY的值,它从偏移5开始并以10结束(即6位长),你需要使用一个(位)掩码,当应用于整个16位像素时,它将产生只有我们感兴趣的部分。


#define GREEN_MASK  0x7E0

相应的掩码为0x7E0,二进制为0000011111100000(十进制为2016)。


uint16_t green = (pixel & GREEN_MASK) ...;

要应用蒙版,请使用AND运算符(&)。


uint16_t green = (pixel & GREEN_MASK) >> GREEN_OFFSET;

应用掩码后,最终会得到一个16位数,这个数字实际上只是一个11位数,因为它的MSB位于第11位。绿色实际上只有6位长,所以我们需要使用右移(11 - 6 = 5)来缩小它,因此使用5作为offset(#define GREEN_OFFSET  5)。


同样常见的是使用位移进行快速乘法和除以2的幂:


 i <<= x;  // i *= 2^x;

 i >>= y;  // i /= 2^y;


查看完整回答
反对 回复 2019-05-28
  • 3 回答
  • 0 关注
  • 1794 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信