1. 程式人生 > >C++的位運算子

C++的位運算子

  • <<按位左移
  • >> 按位右移
  • & 按位與 (區分邏輯與 &&)
  • | 按位或 (區分邏輯或 ||)
  • ^ 按位異或 (兩位不同取1,兩位相同取0)
  • ~ 按位取反(區分邏輯非 !)

應用(源運算元s 掩碼m):

位運算應用口訣

清零取反要用與,某位置一可用或
若要取反和交換,輕輕鬆鬆用異或

1 按位與&

1.1 清零特定位 (mask中特定位置0,其它位為1)

s = s & mask
s = 111 & mask=011
s = 011

1.2 取某數中指定位 (mask中特定位置1,其它位為0)

s = s & mask
s = 111 & mask=010
s = 010

1.3 判斷int型變數是奇數還是偶數

x&1 = 0 偶數
x&1 = 1 奇數

1.4 判斷一個正整數是不是2的冪

return ((x&(x-1))==0)&&(x!=0);
e.g 正整數4 
x=100,
x-1=011
x&(x-1)=0

2 按位或|

常用來將源運算元某些位置1,其它位不變。 (mask中特定位置1,其它位為0)

s = s | mask
s = 101 | mask=010
s = 111

3 按位異或 ^

2.1 使特定位的值取反 (mask中特定位置1,其它位為0)

s = s ^ mask
s = 111 ^ mask=010
s = 101    

2.2 不引入第三變數,交換兩個變數的值

 x ^= y;
 y ^= x;
 x ^= y;

2.3 判斷兩個整數是否相等

 return ((x ^ y) == 0)

例題

寫一個函式,求兩個整數之和,要求在函式體內不得使用+、-、*、/四則運算子號。

class Solution {
public:
    int Add(int num1, int num2)
    {
        if(num2 ==
0) return num1; return Add(num1 ^ num2 ,(num1 & num2) <<1);//注意(num1 & num2) <<1的括號! } }; ``