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