**:
**:^: 按位異或;&:按位與; | :按位或
計算機系統中,數值一律用補碼來表示:因為補碼可以使符號位和數值位統一處理,同時可以使減法按照加法來處理。
對補碼做簡單介紹:數值編碼分為原碼,反碼,補碼,符號位均為0正1負。
原碼 -> 補碼: 數值位取反加1
補碼 -> 原碼: 對該補碼的數值位繼續 取反加1
補碼 的絕對值(稱為真值):正數的真值就是本身,負數的真值是各位(包括符號位)取反加1(即變成原碼並把符號位取反).
b -> -b : 各位(包括符號位)取反加1
加法運算:將乙個整數用二進位制表示,其加法運算就是:相異(^)時,本位為1,進製為0;同為1時本位為0,進製為1;同為0時,本位進製均為0.
所以,不計進製的和為sum = a^b,進製就是arr = a&b,(與sum相加時先左移一位,因為這是進製)。完成加法直到進製為0.
減法運算:a-b = a+(-b) 根據補碼的特性,各位取反加1即可(注意得到的是相反數,不是該數的補碼,因為符號位改變了)
(上面用二進位制實現的加減法可以直接應用於負數)
乘法運算:原理上還是通過加法計算。將b個a相加,注意下面實際的**。
除法運算:除法運算是乘法的逆。看a最多能減去多少個b,
#include
#include
using
namespace
std;
//遞迴版本的加法實現
int add(int a, int b)
//該為迭代版本
int add_iter(int a, int b)
return ans;
}//求a的相反數:將各位取反加一
int negative(int a) //get -a
int minus(int a, int b)
//正數乘法
int multi(int a, int b)
return ans;
}//正數除法
int divide(int a, int b)
return coun;
}//判斷是否是負數,0,正數
int isneg(int a)
int iszero(int a)
int ispos(int a)
//處理負數的乘法和除法
int my_multi(int a, int b)
else
if(isneg(b))
return negative(multi(a, negative(b)));
else
return multi(a, b);
}int my_divide(int a, int b)
if(iszero(a))
return
0; if(isneg(a))
else
if(isneg(b))
return negative(divide(a, negative(b)));
else
return divide(a, b);
}int main(int argc, char **argv)
// 加減乘除位運算
// 程式中實現了比較大小、加減乘除運算。所有運算都用位操作實現
// 在實現除法運算時,用了從高位到低位的減法
// 具體如下,演算法也比較簡單,所以沒有作注釋
#include
#include
using
namespace
std;
int add(int a, int b)
return a;
}//這個和加法一樣了,首先取減數的補碼,然後相加。
int negtive(int a) //取補碼
int sub(int a, int b)
// 判斷正負
int ispos( int a )
int isneg( int a )
int iszero( int a )
//正數乘法運算
int pos_multiply(int a,int b)
return ans;
}//乘法運算
int multiply(int a,int b)
return negtive( pos_multiply( negtive(a), b ) );
}return negtive( pos_multiply(a, negtive(b)) );
}//除法就是由乘法的過程逆推,依次減掉(如果x夠減的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。減掉相應數量的y就在結果加上相應的數量。
int pos_div(int x,int y)
//除法運算
int mydiv( int a, int b )
if( iszero(a) )
return
0; if( ispos(a) )
if( ispos(b) )
return negtive( pos_div( negtive(a), b ) );
return pos_div( negtive(a), negtive(b) );
} // 比較兩個正數的大小(非負也可)
int isbig_pos( int a, int b )
return (c&a);
} // 比較兩個數的大小
int isbig( int a, int b )
return
0; }
if( isneg(b) )
return
1; return isbig_pos(a, b);
}
位運算實現加減乘除
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。...