1、求和
二進位制的加法運算如果計算的時候沒有進製,那麼
異或運算的結果和加法運算的結果是一樣的
例如:2+1=3 與 2^1=3
如果有進製,那麼可以用與運算模擬,先進行與運算,再想左移一位表示進製操作。
所以三步即可:
第一步不考慮進製,對每一位相加。0加0與1加1的結果都0,0加1與1加0的結果都是1。我們可以注意到,這和異或的結果是一樣的。對異或而言,0和0、1和1異或的結果是0,而0和1、1和0的異或結果是1。
接著考慮第二步進製,對0加0、0加1、1加0而言,都不會產生進製,只有1加1時,會向前產生乙個進製。此時我們可以想象成是兩個數先做位與運算,然後再向左移動一位。只有兩個數都是1的時候,位與得到的結果是1,其餘都是0。
第三步把前兩個步驟的結果相加。相當於輸入前兩步驟的結果來遞迴呼叫自己。
int add(int num1, int num2)
2、求平均數
(n1&n2) + ((n1^n2)>>1)
優勢是不會有溢位
3、交換兩個數
int a=8,b=2;最普通的方法:int temp=a,a=b,b=temp,最簡單最常用的,不多說。
稍微高階一點的:
a=a+bb=a-b
a=a-b
再高階一點的位運算:
a=a^bb=a^b
a=a^b
4、判斷int型變數a是奇數還是偶數
a&1 = 0 偶數
a&1 = 1 奇數
5、取int型變數a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1 (先右移再與1)
6、將int型變數a的第k位清0,即a=a&~(1<>16-k (設sizeof(int)=16)
9、int型變數a迴圈右移k次,即a=a>>k|a<<16-k (設sizeof(int)=16)
10、對於乙個數 x >= 0,判斷是不是2的冪。
boolean power2(int x)
11、不用temp交換兩個整數
void swap(int x , int y)
12、計算絕對值
int abs( int x )
13、取模運算轉化成位運算 (在不產生溢位的情況下)
a % (2^n) 等價於 a & (2^n - 1)
14、乘法運算轉化成位運算 (在不產生溢位的情況下)
a * (2^n) 等價於 a<< n
15、除法運算轉化成位運算 (在不產生溢位的情況下)
a / (2^n) 等價於 a>> n
例: 12/8 == 12>>3
16、a % 2 等價於 a & 1
17、if (x == a)
x= b;
else x= a;
等價於 x= a ^ b ^ x;
18、x 的 相反數 表示為 (~x+1)
19、輸入2的n次方:1 << n
20、乘除2的倍數:千萬不要用乘除法,非常拖效率。只要知道左移1位就是乘以2,右移1位就是除以2就行了。比如要算25 * 4,用25 << 2就好啦
21、求乙個二進位制數中1的個數
對於32位的數來說
int bitcount4(unsigned int n)
位運算的作用
運算 and運算通常用於二進位製取位操作,例如乙個數 and 1的結果就是取二進位制的最末位。這可以用來判斷乙個整數的奇偶,二進位制的最末位為0表示該數為偶數,最末位為1表示該數為奇數 運算 or運算通常用於二進位制特定位上的無條件 賦值,例如乙個數or 1的結果就是把二進位制最末位強行變成1。如果...
按位運算和作用
1.按位與運算 按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 否則為0。參與運算的數以補碼方式出現。例如 9 5可寫算式如下 00001001 9的二進位制補碼 00000101 5的二進位制補碼 00000001 1的二進位制補碼...
位運算的應用場景及作用
位運算加速技巧 本方法可以讓c c 語言指令進一步接近彙編指令的執行效率,提高嵌入式系統的速度和穩定性。x x 2 x x 64 改為 x x 1 2 21 x x 6 64 26 x x 2 x x 64 改為 x x 1 2 21 x x 6 64 26 x int 1.232 改為 x 1.2...