演算法 解析位運算

2022-05-02 23:24:10 字數 2438 閱讀 4173

位運算子是作用於整數的運算物件,把運算物件看成二進位制的集合。

運算子功能用法~

按位求反

~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 ...