C 用位運算實現加減乘除

2021-10-14 18:27:33 字數 2421 閱讀 6988

#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為進製...