1. 程式人生 > 其它 >C++中的位運算總結 C++中的位運算總結

C++中的位運算總結 C++中的位運算總結

C++中的位運算總結

1)位運算

位運算是指對轉換成二進位制的數字進行每一位上的0、1的運算,運算涉及到五種運算:與(&),或(|),異或(^),左移(<<),右移(>>)。

如下表所示:

  

 

 

 
與(&) 0 & 0 =0 1 & 0 = 0 0 & 1 = 1 1 & 1 = 1
或(|) 0 | 0 = 0 1 | 0 = 1 0 | 1 = 1 1 | 1 = 1
異或(^) 0 ^ 0 = 0 1 ^ 0 = 1 0 ^ 1 = 1 1 ^ 1 =0
左移(<<)

0001 1001 << 2 = 0110 0100

1000 1010 << 3 = 0101 0000

右移(>>)

0000 1010 >> 2 =  0000 0010

1000 1010 >> 3 = 1111 0001

左移:

左移運算子m << n表示把m左移n位。在左移n位的時候,最左邊的n位將被丟棄,同時在最右邊補上n個0。

右移:

右移運算子m >> n表示把m右移n位。右移n位的時候,最右邊的n位將被丟棄。但是與左移不一樣的是,右移時候的最左邊的n位處理:如果數字是一個無符號數值,則用0填補最左邊的n位;如果數字是一個有符號數值,則用數字的符號位填補最左邊的n位,如上表中的:1000 1010 >> 3 = 1111 0001。

這五種運算子都是雙目操作符,另有一種單目操作符~,表示取反。即:~1 = 0,~0 = 1。

位運算子只能用於整型資料,對於其它型別的資料進行位操作編譯器會報錯。

位運算子的優先順序比較低,因此應儘量使用括號來保證運算順序。

2.位運算子的常用技巧

1)判斷奇偶

只要根據最末位是0還是1即可判斷整數的奇偶性。例如整數n,可以用if((n & 1) == 0)來判斷,要比if(n % 2 == 0)判斷奇偶性效率高。

2)交換資料

void swap(int &a, int &b)
{
    if (a != b)
    {
        a ^= b;//a=(a^b);

        b ^= a;//^運算滿足交換律,b^(a^b)=b^b^a

        a ^= b;//a=(a^b)^a
    }
}

由於一個數和自己異或的結果為0,並且任何數與0異或都會不變的,所以第二步中b ^= a就等價於b = b ^ b ^ a = a,即b被賦上了a的值。

3)變換符號

正整數變成負整數,負整數變成正整數,只需將原數的二進位制取反後加1即可。例如:

對於-11和11,可以通過下面的變換方法將-11變成11

1111 0101(二進位制) 取反-> 0000 1010(二進位制) 加1-> 0000 1011(二進位制)

同樣可以這樣的將11變成-11

0000 1011(二進位制) 取反-> 0000 0100(二進位制) 加1-> 1111 0101(二進位制)

3.位運算應用

1)高低位互換

給出一個16位的無符號整數。稱這個二進位制數的前8位為“高位”,後8位為“低位”。現在寫一程式將它的高低位交換。例如,數34520用二進位制表示為:       10000110 11011000 將它的高低位進行交換,我們得到了一個新的二進位制數:       11011000 10000110
它即是十進位制的55430。
這個問題用位操作解決起來非常方便,設x=34520=10000110 11011000(二進位制) 由於x為無符號數,右移時會執行邏輯右移即高位補0,因此x右移8位將得到00000000 10000110。而x左移8位將得到11011000 00000000。可以發現只要將x>>8與x<<8這兩個數相或就可以得到1101100010000110。 2)判斷一個整數是不是2的整數次方

如果一個整數是2的整數次方,那麼它的二進位制標識中一定有且只有一位是1,而其他所有位均為0.

 

轉載連線:https://www.cnblogs.com/tgycoder/p/5234568.html

1)位運算

位運算是指對轉換成二進位制的數字進行每一位上的0、1的運算,運算涉及到五種運算:與(&),或(|),異或(^),左移(<<),右移(>>)。

如下表所示:

  

 

 

 
與(&) 0 & 0 =0 1 & 0 = 0 0 & 1 = 1 1 & 1 = 1
或(|) 0 | 0 = 0 1 | 0 = 1 0 | 1 = 1 1 | 1 = 1
異或(^) 0 ^ 0 = 0 1 ^ 0 = 1 0 ^ 1 = 1 1 ^ 1 =0
左移(<<)

0001 1001 << 2 = 0110 0100

1000 1010 << 3 = 0101 0000

右移(>>)

0000 1010 >> 2 =  0000 0010

1000 1010 >> 3 = 1111 0001

左移:

左移運算子m << n表示把m左移n位。在左移n位的時候,最左邊的n位將被丟棄,同時在最右邊補上n個0。

右移:

右移運算子m >> n表示把m右移n位。右移n位的時候,最右邊的n位將被丟棄。但是與左移不一樣的是,右移時候的最左邊的n位處理:如果數字是一個無符號數值,則用0填補最左邊的n位;如果數字是一個有符號數值,則用數字的符號位填補最左邊的n位,如上表中的:1000 1010 >> 3 = 1111 0001。

這五種運算子都是雙目操作符,另有一種單目操作符~,表示取反。即:~1 = 0,~0 = 1。

位運算子只能用於整型資料,對於其它型別的資料進行位操作編譯器會報錯。

位運算子的優先順序比較低,因此應儘量使用括號來保證運算順序。

2.位運算子的常用技巧

1)判斷奇偶

只要根據最末位是0還是1即可判斷整數的奇偶性。例如整數n,可以用if((n & 1) == 0)來判斷,要比if(n % 2 == 0)判斷奇偶性效率高。

2)交換資料

void swap(int &a, int &b)
{
    if (a != b)
    {
        a ^= b;//a=(a^b);

        b ^= a;//^運算滿足交換律,b^(a^b)=b^b^a

        a ^= b;//a=(a^b)^a
    }
}

由於一個數和自己異或的結果為0,並且任何數與0異或都會不變的,所以第二步中b ^= a就等價於b = b ^ b ^ a = a,即b被賦上了a的值。

3)變換符號

正整數變成負整數,負整數變成正整數,只需將原數的二進位制取反後加1即可。例如:

對於-11和11,可以通過下面的變換方法將-11變成11

1111 0101(二進位制) 取反-> 0000 1010(二進位制) 加1-> 0000 1011(二進位制)

同樣可以這樣的將11變成-11

0000 1011(二進位制) 取反-> 0000 0100(二進位制) 加1-> 1111 0101(二進位制)

3.位運算應用

1)高低位互換

給出一個16位的無符號整數。稱這個二進位制數的前8位為“高位”,後8位為“低位”。現在寫一程式將它的高低位交換。例如,數34520用二進位制表示為:       10000110 11011000 將它的高低位進行交換,我們得到了一個新的二進位制數:       11011000 10000110
它即是十進位制的55430。
這個問題用位操作解決起來非常方便,設x=34520=10000110 11011000(二進位制) 由於x為無符號數,右移時會執行邏輯右移即高位補0,因此x右移8位將得到00000000 10000110。而x左移8位將得到11011000 00000000。可以發現只要將x>>8與x<<8這兩個數相或就可以得到1101100010000110。 2)判斷一個整數是不是2的整數次方

如果一個整數是2的整數次方,那麼它的二進位制標識中一定有且只有一位是1,而其他所有位均為0.

 

轉載連線:https://www.cnblogs.com/tgycoder/p/5234568.html