C++的位運算子
阿新 • • 發佈:2018-11-17
- <<按位左移
- >> 按位右移
- & 按位與 (區分邏輯與 &&)
- | 按位或 (區分邏輯或 ||)
- ^ 按位異或 (兩位不同取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的括號!
}
};
``