C++位操作與、或、非、異或、取反詳解
一、按位邏輯運算子
1,按位取反~
如:~(10)結果位(01)
~var不會改變var的值,如果要改var值,可以為var=~var;
2,按位與&
有0得0,全1出1
var&=300等價於var=var&300
3,按位或|
有1出1,全0出0
var|=300等價於var=var|300
4,按位異或^
兩者相等為0,不等為1
二、位邏輯運算子運用
1,用法:掩碼(&)
按位與運算子常用於掩碼(mask),可以獲取某個位的狀態
2,用法:開啟位(設定位) (|)
有時必須開啟其中某一位,其它位不變,這種情況可以採用按位或運算子
原理:因為使用|運算子,任何與0組合,結果都為本身;任何與1組合,結果都為1
例如:想把0xFE第0位置為1
則:0xFE|1=0xFF
3,用法:關閉位(清空位)(&、~)
有時必須關閉其中某一位,其它位不變,這種情況可以採用按位取反再與
原理:flags=flags&~Mask,Mask只要第一號位為1,其它都為0,所以,~Mask除1號為0,其它都為1
4,用法:切換位(^)
切換位是指改變原來的狀態,開變為關,關變為開
原理:假設b為一個位,若b==1,則b^1=0;若b==0,則b^1=1
另外,無論b為0或者1,0^b均為b
所以,flags=flags^Mask; Mask位為1的切換,位為0的不變
5,用法:檢查位
if((flags&Mask)==Mask)
{
TRACE(L"n位為1");
}
由於按位運算子的優先順序比==低,所以必須加括號
為了避免資訊漏過邊界,掩碼至少要與其覆蓋的值寬度相同。
三、移位運算子
1,左移<<
(10001010)<<2//表示式
(00101000) //結果值
假設value為1,那麼value<<2為4,但是value本身不變,仍為1
使用<<=來更改變數的值
value<<=2;//把value值改為4
2,右移>>
有符號型別右移結果取決於機器,這裡以無符號為例子
(10001010)>>2//表示式
(00100010) //結果值
value>>=3;//右移後的結果賦值給value
3,移位運算子
number<<n; //number乘以2的n次冪
number>>n; //如果number為非負,則用number除以2的n次冪
這些移位運算子類似於十進位制中移動小數點來乘以或除以10
運用:
#define BYTE_MASK 0xFF
unsigned long color = 0x002a162f;
unsigned char blue, green, red;
red = color&BYTE_MASK;
green = (color >> 8)&BYTE_MASK;
blue = (color >> 16)&BYTE_MASK;
概念:位欄位?