位運算加減乘除

2021-08-03 04:19:26 字數 2903 閱讀 1747

**:

**:^: 按位異或;&:按位與; | :按位或

計算機系統中,數值一律用補碼來表示:因為補碼可以使符號位和數值位統一處理,同時可以使減法按照加法來處理。

對補碼做簡單介紹:數值編碼分為原碼,反碼,補碼,符號位均為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。...