位運算子在實際專案中使用的比較少,但是由於效率高,並且有助於理解程式底層,還有有理解的必要的,我之前一直都位運算子比較疑惑,做了些演算法題之後漸漸理解了。
按位與:」&」
例子: 2 (0010) & 7 (0111) => 2 (0010)
按位異或 :」^」
例子: 2 (0010) ^ 7 (0111) => 5 (0101)
按位或: 「|」
例子:2 (0010) | 7 (0111) => 7 (0111)
按位非」~」
例子: ~2(0010) => -3 (1101)
注意這裡-3是2的補餘,負數的顯示方式和正數不同,首位是1,後面是補餘。如:
1111 是 -1,
1110 是 -2, 即 ~2 + 1, ~0010 => 1101, 1101 + 1 = 1110 => 2
1101 是 -3, 即 ~3 + 1
所以如果想要獲得乙個正整數的相反數,只要使用 ~x + 1 即可;
位移: 「<<」 和 「>>」
例子: 2 (0010) << 1=> 4 (0100)
2 (0010) >> 1=> 1 (0001)
應用,使用位操作符實現程式中的加法操作:
首先我們要使用按位與「&」操作符來找到進製數,因為在二進位制當中,兩個數相加,只有同一位上都是1,才會向上進一位;
然後使用異或操作符「^」來計算兩個數相加之後當前位的值(此時不考慮進製數),因為二進位制中只有乙個是0,另乙個是1,相加後當前位才是1;
最後將進製數左移一位,加到原來已經相加的結果上,產生下乙個進製數,直到進製數等於0;
// 迭代演算法
public
intgetsum(int a, int b)
return a;
}// 迭代演算法
public
intgetsubtract(int a, int b)
return a;
}// 遞迴演算法
public
intgetsum(int a, int b)
// 遞迴演算法
public
intgetsubtract(int a, int b)
// 獲得乙個數的相反數
public
intnegate(int x)
c 位運算子的理解
問題1 10 1等於多少?問題2 10 1等於多少?儲備知識點 判斷是右位移運算,還是左位移運算?根據位運算子閉口的方向判斷,閉口在右,說明是右位移運算子 閉口在左,說明是左位移運算子 可以想象水流向閉合處流去,水流的方向就是位運算的方向 十進位制轉二進位制的方法 短除法,將被運算的值,除以2,記錄...
位運算子的一些簡單應用
在第一節概述裡就說了,c語言是一種中級語言,能對計算機硬體直接操作,這就涉及到位的概念。一 位的概念 我們知道,在計算機中,一位元組佔8位 現在的某些電腦也有佔16位的 這樣表示的數的範圍為0 255,也即00000000 11111111。位就是裡面的0和1。char c 100 實際上c應該是0...
位運算子的一些簡單應用
在第一節概述裡就說了,c語言是一種中級語言,能對計算機硬體直接操作,這就涉及到位的概念。一 位的概念 我們知道,在計算機中,一位元組佔8位 現在的某些電腦也有佔16位的 這樣表示的數的範圍為0 255,也即00000000 11111111。位就是裡面的0和1。char c 100 實際上c應該是0...