論位運算的作用

2021-07-22 20:03:03 字數 1770 閱讀 1145

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+b

b=a-b

a=a-b

再高階一點的位運算:

a=a^b

b=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...