#include
using
namespace std;
intmain()
cout<"+"<"="/輸出結果
}
兩個數x、y求異或,得到的x,y不進製的和x0
101y
0110
x^y001
1x與y求與,再左移一位,得到的是進製的數。x0
101y
0110
x&y010
0(x&y)<<110
00將不進製的和與進製的數再求和,當進製為0的時候,迴圈結束,得到的就是運算的結果。
與加法類似,就是將減數取反。
#include
#include
using
namespace std;
intmain()
cout<"-"<"="/輸出結果
}
#include
using
namespace std;
intadd
(int x,
int y)
;int
main()
cout<}int
add(
int x,
int y)
//加法運算函式
return ans;
}
首先我們來看一下二進位制的乘法可以這麼分解,簡單起見,我們讓兩個四位的二進位制數相乘:
0110 * 1010 = 0110 * 1000 + 0110 * 0010
我們對於乘數(後乙個數)進行了分解,為什麼這樣做呢,轉化為十進位制我們再看看就明白了:
6 * 10 = 6 * 8 + 6 * 2
也就是讓被乘數乘以2的倍數,在二進位制裡面,乙個數乘以2的倍數,就相當於左移對應的位數,這樣,我們就可以運用位運算來實現乘法。所以
0110 * 1010 = 0110 * 1000 + 0110 * 0010
就相當於令0110左移3位再加上0110左移一位。
我們看主函式中if判斷條件,1的二進位製取反,得到的是乙個最低為為0,其他位為1的數。這個數與乙個數求或,相當於將乙個數除最後一位全部置1(邏輯代數基本知識).~11
1111
110a
****
****
a|~111
1111
1*可見,如果x最後一位為0,則求或的結果再求反就是1,if裡的語句執行。因為我們這裡的a相當於程式裡面的~y,所以當y的最後一位為1,則程式執行。也就是說當y最後一位為1,對x求和得到ans。這樣做的原因就是我們之前舉例說明的:
0110 * 1010 = 0110 * 1000 + 0110 * 0010
對於乘數要右移1位,被乘數要左移1位,當乘數右移m位時最小位為1,則此時左移了m位的被乘數相當於已經乘以了2^m(2的m次方)。具體過程可以看下面:xy
y最後一位
ans00000110
0000101000
00001100
00000101
10110 * 0010 (左移1位相當於乘2)
00011000
00000010
00110*0010
00110000
00000001
10110*0010 + 0010*1000
01100000
00000000
00110*0010 + 0010*1000
迴圈結束
#include
using
namespace std;
intadd
(int x,
int y)
;int
minus
(int x,
int y)
;int
main()
cout<}int
add(
int x,
int y)
//加法運算函式
return ans;
}int
minus
(int x,
int y)
//減法運算函式
除法的比較簡單,就是用被除數不停減去除數,直到被除數小於除數。期間每減一次就令結果ans+1.稍作修改也可以寫為求餘 (x%y)的程式,大家可以自己試試。
這部分程式就本身而言應用價值並不大,但是其中學到的利用位運算來處理資料特別重要。
操作符按位與
按位或按位異或
按位取反
左移右移
操作符號&|
^~<<
>>
作用清零特定位
特定位置1
特定位值取反
補碼相當於乘2
相當於除以2
C 位運算實現加減乘除
近日複習劍指offer,看到了當時寫第65題題實現了位運算的加減乘除法,特此記錄 int add int num1,int num2 return num1 int add2 int num1,int num2 2.一種減法運算 intnegtive int num1,int num2 3.一種乘法...
位運算實現加減乘除
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為進製...