日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用位运算实现四则运算之加减乘除

發布時間:2025/10/17 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用位运算实现四则运算之加减乘除 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://www.cnblogs.com/dandingyy/archive/2012/10/29/2745570.html

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

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

對補碼做簡單介紹:數值編碼分為原碼,反碼,補碼,符號位均為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<iostream> #include<cstdlib> using namespace std;//遞歸版本的加法實現 int Add(int a, int b) {return b ? Add(a^b, (a&b)<<1) : a;/*if(b)return plus_rec(a^b, (a&b)<<1);elsereturn a;*/ }//該為迭代版本 int Add_iter(int a, int b) {int ans;while(b){ans = a^b;b = (a&b)<<1;a = ans;}return ans; }//求a的相反數:將各位取反加一 int negative(int a) //get -a {return Add(~a, 1); }int Minus(int a, int b) {return Add(a, negative(b)); }//正數乘法 int Multi(int a, int b) {int ans = 0;while(b){if(b&1)ans = Add(ans, a);a = a << 1;b = b >> 1;}return ans; }//正數除法 int Divide(int a, int b) {int coun = 0;while(a >= b){a = Minus(a, b);coun = Add(coun, 1);}return coun; }//判斷是否是負數,0,正數 int isneg(int a) {return a & 0x8000; } int iszero(int a) {return !(a & 0xFFFF); } int ispos(int a) {return (a&0xFFFF) && !(a&0x8000); }//處理負數的乘法和除法 int My_Multi(int a, int b) {if(iszero(a) || iszero(b))return 0;if(isneg(a)){if(isneg(b))return Multi(negative(a), negative(b));elsereturn negative(Multi(negative(a), b));}else if(isneg(b))return negative(Multi(a, negative(b)));elsereturn Multi(a, b); }int My_Divide(int a, int b) {if(iszero(b)){cout << "Error!" << endl;exit(1);}if(iszero(a))return 0;if(isneg(a)){if(isneg(b))return Divide(negative(a), negative(b));elsereturn negative(Divide(negative(a), b));}else if(isneg(b))return negative(Divide(a, negative(b)));elsereturn Divide(a, b);}int main(int argc, char **argv) {int a = 5;int aa = -5;int b = 3;int bb = -3;int c = 15;cout << Add(a, b) << endl;cout << Add(a, bb) << endl;cout << Minus(a, b) << endl;cout << Minus(b, a) << endl;cout << Multi(a, b) << endl;cout << My_Multi(aa, b) << endl;cout << Divide(c, a) << endl;return 0; }

總結

以上是生活随笔為你收集整理的用位运算实现四则运算之加减乘除的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。