一、常見功能的位操作實現:
(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。
二、位操作實現加法
1、原理:主要思想是將加法的計算結果分解為兩部分:第一是不考慮進製的運算結果,第二是進製,然後再將這兩者相加,即得到結果。詳細表述如下:
(1)不考慮進製的計算結果,以一位二進位制數來表示:
1+1=0
1+0=1
0+1=1
0+0=0
這個過程可以用異或位運算子來表示,即:
1^1=0
1^0=1
0^1=1
0^0=0
則a^b表示不考慮進製的計算結果。
(2)進製,同樣以一位二進位制數表示:
0+0→不進製
0+1→不進製
1+0→不進製
1+1→進製,即相當於是10,將10加到不考慮進製的計算結果上,即可得到整個的計算結果,而可以用位運算的與操作和向左的移位操作即可模擬上述的是否進製:
0&0=0 (0&0)<<1=0
0&1=0 (0&1)<<1=0
1&0=0 (1&0)<<1=0
1&1=1 (1&1)<<1=10
如此,即將運算結果計算出來了。接下來,需要按照遞迴的方式將上述思想實現,主要原因是將運算結果分為不考慮進製的運算結果a和進製值b,則計算結果為a+b,但該運算可能還是會產生進製,故將a和b再次採用這種計算方法進行計算,直到進製部分為0,即表示上次加法計算沒有進製,則上次加法計算的不考慮進製的運算結果,即為整個加法計算的結果。例子如下:
2、**實現
(1)不用遞迴:
int getsum(int a, int b)
while (carry != 0);
return add;
}
(2)遞迴實現:
int getsum(int a, int b)
三、位操作實現減法
減法化為加法,即a-b=a+(-b)。**實現:
int subtraction(int a, int b)
四、位操作實現乘法
unsigned int multiply(unsigned int a, unsigned int b)
五、位操作實現除法
int pos_div(int x, int y)// x/y,**得到結果的整數部分
}return ans;
}
**解釋,考慮 8 / 3
:8 0000 1000
/ 3 0000 0011
if ((x >> i) >= y)//這句**可以反過來講,
(x >> i) >= y
等價於(x >> i)<= y<,即
x>=y<,也就是說假如
y《不溢位,
y左移位數如果大於i,
y就大於x了
; //y的左移
<=>x
的右移,y
左移=>y
不動,作為商的
1左移相應位數,和
y相乘的話,
y也就左移相應位數了,此時商的最高不為
0的位為
1 << i
。接下來剩餘的數
x -= (y << i)
同樣的操作。
位運算實現加減乘除
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。...