位運算實現加減乘除

2021-08-29 01:17:59 字數 1587 閱讀 1979

資料在計算機記憶體中是以二進位制儲存的。 幾種常用的位運算:

與運算&: 對應位均為1時為1,其它為0。

或運算|: 對應位均為0時為0,其它為1。

異或運算^: 對應位不相同時為1,相同時為0.

按位取反~: 每一位取反

右移》: 將二進位制進行右移,低位丟掉,高位補零。

左移<

以0111 + 0101為例,觀察異或運算和與運算的結果

0111 ^ 0101 = 0010; //結果的每一位等於對應位相加模二,剛好是不帶進製的加法結果。

0111 & 0101 = 0101; //結果的1表示對應位相加為2,0表示對應位相加小於二,剛好是進製標識。

又因為進製是向高位進製,也就是說如果第二位是1,則表示在計算過程中要向第三位進製,所以可以將與運算結果左移一位後和異或運算的結果做加法。

**如下:

int add(int a, int b)

減法和加法相同,減去乙個數相當於加上這個數的相反數,所以完全可以利用加法操作,唯一需要做的就是求出被減數的相反數。

求相反數的方法:每一位取反,末位加一。

**如下:

//求n的相反數

//~:按位取反

//add:加法操作,末位加一

int negtive(int n)

int sub(int a, int b)

平時在筆算乘法資料都是十進位制的,而拋去思維定勢,把數看成是二進位制,也可以進行筆算乘法,像這樣

根據算式可以知道,對於a * b,每次只需要將a左移一位乘上b的對應位,然後同上一次的結果做加法即可。 也就意味著當b的對應位為1時,對a左移一位然後同上一次的結果做加法。 如果b的對應位為0,只對a左移一位。 當然,上述這些運算不包括符號位,所以兩個運算元都需要先轉換成正數,符號需要單獨考慮。對於4個位元組(32位整數)來說,獲取符號位只需要取出第31位的值即可。

//獲取符號位,判斷是正負

int getsign(int n)

// 求絕對值

int posabs(int n)

int mul(int a, int b)

a = a << 1;

b = b >> 1;

} return flag == 1 ? negtive(res) : res;

}

int div(int a, int b)

int falg = 0;

if (getsign(a) ^ getsign(b))

falg = 1;

a = posabs(a);

b = posabs(b);

int res = 0;

while (a>=b)

return falg == 1 ? negtive(res) : res;

}

位運算實現加減乘除

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。...