3 回答

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;
添加回答
舉報