1. 程式人生 > >C++位操作與、或、非、異或、取反詳解

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;

概念:位欄位?