位運算子及其使用

2021-10-05 14:43:16 字數 1952 閱讀 5740

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 左移...