C 學習筆記 用位運算實現加減乘除

2021-08-15 16:09:52 字數 1391 閱讀 9488

原文:

資料在計算機記憶體中是以二進位制儲存的。 

幾種常用的位運算:

以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 subtraction(int a, int b)

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

根據算式可以知道,對於a * b,每次只需要將a左移一位乘上b的對應位,然後同上一次的結果做加法即可。 

也就意味著當b的對應位為1時,對a左移一位然後同上一次的結果做加法。 

如果b的對應位為0,只對a左移一位。 

當然,上述這些運算不包括符號位,所以兩個運算元都需要先轉換成正數,符號需要單獨考慮。對於4個位元組(32位整數)來說,獲取符號位只需要取出第31位的值即可。

**如下:

//取出符號位

int getsign(int n)

//求n的絕對值

int positive(int n)

int multiply(int a, int b)

return isnegtive == true ? negtive(res) : res;

}

同乘法一樣,除法也可以進行二進位制筆算,以a / b為例,只有當a >= b時才可以上商,又因為是二進位制,所以商每次只會多1,在每次上1之後a都要減去一次b。**如下:

int divide(int a, int b)

return benegtive == true ? negtive(res) : res;

}

C 用位運算實現加減乘除

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將不進製的和與進製的數再求和...

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