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

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

我一直在尝试在业余时间学习C语言,其他语言(C#,Java等)具有相同的概念(通常是相同的运算符)......

我想知道是,在核心层,是什么位移(<<>>>>>)这样做,可以帮助它什么问题解决,和周围的弯曲什么潜伏的陷阱?换句话说,一个绝对的初学者指导比特移位的所有优点。


蓝山帝景
浏览 1807回答 3
3回答

精慕HU

按位运算(包括位移)是低级硬件或嵌入式编程的基础。如果您阅读了设备规范甚至某些二进制文件格式,您将看到字节,字和dword,分为非字节对齐的位域,其中包含各种感兴趣的值。访问这些位字段以进行读/写是最常见的用法。图形编程中一个简单的实例是16位像素表示如下:&nbsp; bit | 15| 14| 13| 12| 11| 10| 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1&nbsp; | 0 |&nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp;Blue&nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Green&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp;Red&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |要获得绿色值,您可以这样做:&nbsp;#define GREEN_MASK&nbsp; 0x7E0&nbsp;#define GREEN_OFFSET&nbsp; 5&nbsp;// Read green&nbsp;uint16_t green = (pixel & GREEN_MASK) >> GREEN_OFFSET;说明为了获得绿色ONLY的值,它从偏移5开始并以10结束(即6位长),你需要使用一个(位)掩码,当应用于整个16位像素时,它将产生只有我们感兴趣的部分。#define GREEN_MASK&nbsp; 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&nbsp; 5)。同样常见的是使用位移进行快速乘法和除以2的幂:&nbsp;i <<= x;&nbsp; // i *= 2^x;&nbsp;i >>= y;&nbsp; // i /= 2^y;
打开App,查看更多内容
随时随地看视频慕课网APP