位運算子是作用於整數的運算物件,把運算物件看成二進位制的集合。
運算子功能用法~
按位求反
~expr
<<
按位左移
expr1 << expr2
>>
按位右移
expr1 >> expr2
&按位與
expr1 & expr2
^按位異或
expr1 ^ expr2
|按位或
expr1 | expr2
按位求反(~)
將運算物件的二進位制逐位求反,將1置為0,將0置為1,後得到乙個新的值。
int j = 10;cout
<< (~j) << endl;//
-11
按位左移(<<)
將運算物件的二進位制位往左移動n位,右邊以數字0補充空出來的二進位制位,後得到乙個新的值。乙個數m往左移動n位後(移動的範圍在容器的範圍內),那麼新的值將會是m*2n。
int j = 10;cout
<< (j << 2) << endl;//
40
按位右移(>>)
將運算物件的二進位制位往右移動n位,左邊以0或1補充,具體的實現規則要根據具體的環境而定。通常情況下,若是負數那麼左邊補充1,若是正數那麼左邊補充0。乙個浮點數m往右移動n位後,那麼新的值將會是floor(m / 2n),其中floor(x)返回乙個小於或等於浮點數x的最大的整數。
int j = 10;cout
<< (j >> 2) << endl;//
2j = -10
;cout
<< (j >> 2) << endl;//
-3
按位與(&)
將兩個運算物件的二進位制逐位執行與的邏輯操作,只有兩個相同位置都是1,結果才是1;否則是0。
int j = 10;int i = 3
;cout
<< (j & i) << endl; //
2
按位或(|)
將兩個運算物件的二進位制逐位執行或的邏輯操作,兩個相同位置只要有乙個是1,結果就是1;否則為0。
int j = 10;int i = 3
;cout
<< (j | i) << endl; //
11
按位異或(^)
將兩個運算物件的二進位制逐位指向異或的邏輯操作,兩個位相同,結果為0;否則為1。
int j = 10;int i = 3
;cout
<< (j ^ i) << endl; //
9
口訣:
按位與(&),兩個都是1,才是1。按位或(|),只要有乙個為1,就是1。
按位異或(^),相同的為0,不同的為1。
位運算子的使用案例
假設班級中有30個學生,老師每週都會對學生進行一次小測試,測試結果只有通過和不通過兩種。我們用二進位制位代表某個學生在一次測試中是否通過,顯然全班學生可以用乙個無符號整數來表示:
unsigned long quiz1 = 0;
這裡之所以使用long而不是用int,是因為long在每台機器上至少都有32位(有30個學生,可以滿足要求),而int不能保證在每台機器上都有32位(int的最小大小是16位)。
教師必須有權檢查每乙個二進位制位。例如:我們需要對序號為27的學生進行對應的位設定,以表示它通過測驗。為了達到這一目的,首先建立乙個值,該值只有第27位是1,其它位是0,然後再將這個值與quiz1進行或運算,這樣就能將quiz1的第27位設定為1,其它位不變。
為了實現這個目的,需要使用左移運算子和乙個unsigned long型別的整數字面值1就能得到學生第27號學生通過檢測的數值:
1ul<< 27;//
ul 是unsigned long型別
接下來與quiz1進行或運算:
quiz1 |= 1ul<< 27;//
將第27位改為1(通過測試)
假設在重新核對測試結果後發現第27號學生並沒有通過測試,他必須將第27位置為0。此時需要乙個特殊的整數,它的第27位是0,其它位是1,然後將這個值與quiz1進行安位與運算,所得結果除了第27位變成0,其它位都沒變。
quiz1 &= ^(1ul<< 27);//
將第27位改為0(未通過測試)
最後,我們試圖檢測第27位學生的測試情況到底怎麼樣:
bool status = quiz1 & (1ul<< 27);
如果quiz1的第27位是1,那麼計算結果就是非0(真),否則結果是0。
演算法 位運算
public static intpowern int m,int n return m public static void main string args public static boolean ispower int n return false num如何使2的n次冪,那麼num nu...
按位取反運算解析
今天我在看簡明python指南的時候,看到其中乙個計算機計算的問題,它是這樣描述的 x的按位取反結果為 x 1 5 輸出 6。有關本例的更多細節可以參閱 看到這兒我就疑惑了,之前在大學中學習的計算機基礎課程又還給教材了,hhh 無奈,我只好取網上搜尋解析的答案,而網上的解釋說得不太讓人明白,自己結合...
演算法題型 位運算
目錄 一 題型1 不使用中間量交換兩個值 二 劍指offer47.求1 2 n 三 劍指offer48.不使用加減乘除做加法 第一種方法,數 算 若a 1,b 2 a a b 3 b a b 1 a a b 2 第二種方法,位異或運算 若a 1 01b,b 2 10b a a b 01 10 11 ...