位運算 實現加減乘除 取最高位1

2021-06-26 00:02:44 字數 1626 閱讀 6457

分類: c/c++

需要熟練掌握一些常見功能的位操作實現,具體為:

<1> 常用的等式:-n = ~(n-1) = ~n+1

<2> 獲取整數n的二進位制中最後乙個1:n&(-n) 或者 n&~(n-1),如:n=010100,則-n=101100,n&(-n)=000100

<3> 去掉整數n的二進位制中最後乙個1:n&(n-1),如:n=010100,n-1=010011,n&(n-1)=010000

可以很容易地用「異或」和「或」操作實現整數加法運算:對應位數的「異或操作」可得到該位的數值,對應位的「與操作」可得到該位產生的高位進製,如:a=010010,b=100111,計算步驟如下:

第一輪:a^b=110101,(a&b)<<1=000100, 由於進製(000100)大於0,則進入下一輪計算,a=110101,b=000100,a^b=110001,(a&b)<<1=001000,由於進製大於0,則進入下一輪計算:a=110001,b=001000,a^b=111001,(a&b)<<1=0,進製為0,終止,計算結果為:111001。

**如下:

int add(inta, intb) while(carry != 0);

return add;

}減法可很容易地轉化為加法:a - b = a + (-b) = a + (~b + 1 )

**如下:

int subtract(inta,intb)

先看乙個例項:1011*1010:

1011

* 1010

----------

10110 < 左移一位,乘以0010

+ 1011000 < 左移3位,乘以1000

----------

1101110

因而乘法可以通過系列移位和加法完成。最後乙個1可通過b&~(b-1)求得,可通過b& (b-1)去掉,為了高效地得到左移的位數,可提前計算乙個map,**如下:

int multiply(inta, intb)

if(neg)

sum = -sum;

returnsum;}

乘法可很容易轉化為減法操作,主要思想與乘法實現類似,**如下:

int divide(inta, intb)

intq = 0;

for(inti = msb; i >= 0; i--)

if(neg)

return-q;

returnq;}

位操作實現加減乘除四則運算

乙個正整數值採用integer.highestonebit(n)可以獲取最高位,**為:

public static int prevpowerof2(int n)

highestonebit(int i)

執行完i|=(i>>>1)後,最高位1的右邊也成為1

執行i|=(i>>>2)後,最高位1右邊的1+2=3位以內都成為1

執行i|=(i>>>4)後,最高位1右邊的1+2+4=7位以內都成為1

......

執行i|=(i>>>16)後,最高位1右邊的1+2+4+8+16=31位以內都成為1

i^(i>>>1)即可將最高位1右邊的1都置為0

public static int nextpowerof2(int n)

位運算實現加減乘除

include include 加法運算 int add int a,int b 補碼中正數轉負數的原理 int negative int a 減法運算 int sub int a,int b 判斷正負 bool isnegative int a 僅計算正數乘法 int multi help int...

位運算實現加減乘除

關於邏輯右移和算術右移 vs中,對於unsigned型別,是邏輯右移,對於signed,算術右移 加法器的實現 對於不考慮進製的加法 0 0 0 1 0 1 0 1 1 1 1 0 即是異或運算 考慮進製 0 0 1 0 0 0 1 0 1 1 1 即是與運算 以下程式,a即不考慮進製部分,b為進製...

位運算實現加減乘除

位運算的思想可以應用到很多地方,這裡簡單的總結一下用位運算來實現整數的四則運算。1.整數加法 cpp view plain copy intadd inta,intb return a 我的思路主要是利用a 1的位運算就是最左端 從第0位開始向左 連續的1變為0,原先a中為0的位置最低那一位變為1。...