原文:
資料在計算機記憶體中是以二進位制儲存的。
幾種常用的位運算:
以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...