title
date
br#description
c語言位運算子及其使用
2020-04-23 03:01:19 -0700
位運算
c語言
c提供了按位邏輯運算子和移位運算子
運算子含義
~
按位取反
&
按位與``
^
按位異或
掩碼所謂掩碼就是一些設定為開(1)或關(0)的位組合 例如
#include #define mask 0x02
int main(void)
輸出
255
2
按位與,二者都為1,結果才為1 0x02=0b00000010 所以除了第二位保持不變,其他位都被置0
常用於
ch &= 0xff;
這個掩碼保持ch後8位不變,其他位都設為0,無論ch原來是8,16,32位,最終的值都被修改為乙個8位位元組
開啟位有時需要開啟某一位而保持其他位不變,則可以利用|
進行或運算
//假設 flags 為 0b01001100
//假設 mask 為 0b00000001
flags |= mask;
//經過或運算,flags 變為 0b01001101
其他位不變而把最低位開啟了
關閉位
flags &= ~mask;
切換位使用^
運算子,首先對於異或運算有乙個特點 0^b=b 1^b=~b 即乙個數與0異或該位保持不變,而如果與1異或則會被取反
//假設 flags 為 0b00001111
//假設 mask 為 0b10110110
flags ^= mask;
結果flags將會變為0b10111001,即flags中與mask為1的位相對應的位都被切換了,為0的都保持不變
檢測位的值
比如檢測flags中第一位的值是否為1,則flags等於0b******xx,這些位都不確定,所以不能使用
//mask==0x00000001
if(flags == mask)
printf("yes");
而應當
if((flags & mask) == mask)
printf("yes");
由於&比==優先順序低,所以要加上括號
左移運算子<<
將左側運算物件的每一位向左移動右側物件的位數,左末端值丟失,用0填充空出的位置 右移運算子>>
將右側運算物件的每一位向右移動右側物件的位數,右末端值丟失,對於無符號型別,用0填充空出的位置,對於有符號型別,結果取決於機器,可用0或符號位的副本填充
乘除法
num <<= n; //num乘以2的n次冪
num >>= n; //如果num非負(因為不同機器右移結果不確定),則用num除以2的n次冪
提取位假設用乙個unsigned long
型別的值表示顏色,低階位位元組儲存紅色的強度,下一位元組為綠色,再下一位元組為藍色,隨後你希望將每種顏色的強度儲存在3個不同的unsigned char
中,如下
#include #define byte_mask 0xff
unsigned long color;
unsigned char red, green, blue;
int main(void)
位運算子及其應用
通過對數字進行移位操作,相比於乘除操作,效率要高。1 通過位運算代替取模 運算,來判斷num 位奇數或偶數 num 0x1 1 此時num為奇數 num 0x1 0 此時num為偶數 2 通過移位來代替乘除法 乘除數為2的冪 右移n位,表示 num 除以2的n次方 num n 左移n位,表示 num...
位運算子,「,」逗號運算子,
位運算子有 按位與 按位或 按位異或 按位取反 優先順序從高到低,依次為 按位與運算有兩種典型用法,一是取乙個位串資訊的某幾位,如以下 擷取x的最低7位 x 0177。二是讓某變數保留某幾位,其餘位置0,如以下 讓x只保留最低6位 x x 077。按位或運算的典型用法是將乙個位串資訊的某幾位置為1。...
運算子之位運算子
右移 負數 無符號右移 或 異或 與 非 說明 位運算子都是作用在二進位製上的 比如 n 50 n 1 結果是多少?100 n 2 結果是多少?200 n 5 結果是多少?1600 為什麼會是這樣的呢?運算的邏輯如下 1,n 50 2,n的二進位制是 0011 0010 3,0011 0010 左移...