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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

用位运算实现加减乘除

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

聽同學百度二面中,不準用四則運算操作符來實現四則運算。一想就想到了計算機組成原理上學過的。位運算的思想可以應用到很多地方,這里簡單的總結一下用位運算來實現整數的四則運算。

加法運算:

[cpp]?view plaincopy
  • int?AddWithoutArithmetic(int?num1,int?num2)??
  • {??
  • ????if(num2==0)?return?num1;//沒有進位的時候完成運算??
  • ????int?sum,carry;??
  • ????sum=num1^num2;//完成第一步沒有進位的加法運算??
  • ????carry=(num1&num2)<<1;//完成第二步進位并且左移運算??
  • ????return?AddWithoutArithmetic(sum,carry);//進行遞歸,相加??
  • }??
  • 簡化一下:

    [cpp]?view plaincopy
  • int?Add(int?a,int?b)??
  • {??
  • ????return?b???Add(a^b,(a&b)<<1)?:?a;??
  • ????/*if(b)?
  • ????????return?Add(a^b,(a&b)<<1);?
  • ????else?
  • ????????return?a;*/??
  • }??
  • 上面的思路就是先不計進位相加,然后再與進位相加,隨著遞歸,進位會變為0,遞歸結束。?

    非遞歸的版本如下:

    [cpp]?view plaincopy
  • int?Add(int?a,?int?b)??
  • {??
  • ????int?ans;??
  • ????while(b)??
  • ????{???//直到沒有進位??
  • ????????ans?=?a^b;????????//不帶進位加法??
  • ????????b?=?((a&b)<<1);???//進位??
  • ????????a?=?ans;??
  • ????}??
  • ????return?a;??
  • }???
  • 減法運算:

    [cpp]?view plaincopy
  • //這個和加法一樣了,首先取減數的補碼,然后相加。??
  • int?negtive(int?a)???//取補碼??
  • {??
  • ????return?Add(~a,?1);??
  • }??
  • int?Sub(int?a,?int?b)??
  • {??
  • ????return?Add(a,?negtive(b));??
  • }???
  • 正數乘法運算:

    [cpp]?view plaincopy
  • //正數乘法運算??
  • int?Pos_Multiply(int?a,int?b)??
  • {??
  • ????int?ans?=?0;??
  • ????while(b)??
  • ????{??
  • ????????if(b&1)??
  • ????????????ans?=?Add(ans,?a);??
  • ????????a?=?(a<<1);??
  • ????????b?=?(b>>1);??
  • ????}??
  • ????return?ans;??
  • }??
  • 整數除法(正整數)

    [cpp]?view plaincopy
  • //除法就是由乘法的過程逆推,依次減掉(如果x夠減的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。減掉相應數量的y就在結果加上相應的數量。??
  • int?Pos_Div(int?x,int?y)??
  • {??
  • ????int?ans=0;??
  • ????for(int?i=31;i>=0;i--)??
  • ????{??
  • ????????//比較x是否大于y的(1<<i)次方,避免將x與(y<<i)比較,因為不確定y的(1<<i)次方是否溢出??
  • ????????if((x>>i)>=y)??
  • ????????{??
  • ????????????ans+=(1<<i);??
  • ????????????x-=(y<<i);??
  • ????????}??
  • ????}??
  • ????return?ans;??
  • }??
  • 完整的實現:

    [cpp]?view plaincopy
  • //?加減乘除位運算???
  • //?程序中實現了比較大小、加減乘除運算。所有運算都用位操作實現???
  • //?在實現除法運算時,用了從高位到低位的減法???
  • //?具體如下,算法也比較簡單,所以沒有作注釋??
  • #include<iostream>??
  • #include<cstdio>??
  • using?namespace?std;??
  • ??
  • int?Add(int?a,?int?b)??
  • {??
  • ????int?ans;??
  • ????while(b)??
  • ????{??//直到沒有進位??
  • ????????ans?=?a^b;????????//不帶進位加法??
  • ????????b?=?((a&b)<<1);???//進位??
  • ????????a?=?ans;??
  • ????}??
  • ????return?a;??
  • }??
  • ??
  • //這個和加法一樣了,首先取減數的補碼,然后相加。??
  • int?negtive(int?a)???//取補碼??
  • {??
  • ????return?Add(~a,?1);??
  • }??
  • int?Sub(int?a,?int?b)??
  • {??
  • ????return?Add(a,?negtive(b));??
  • }??
  • ??
  • //?判斷正負???
  • int?ispos(?int?a?)???
  • {?//正??
  • ????return?(a&0xFFFF)?&&?!(a&0x8000);??
  • }??
  • int?isneg(?int?a?)???
  • {?//負??
  • ????return?a&0x8000;??
  • }??
  • int?iszero(?int?a?)??
  • {?//0??
  • ????return?!(a&0xFFFF);??
  • }??
  • ??
  • //正數乘法運算??
  • int?Pos_Multiply(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?Multiply(int?a,int?b)??
  • {??
  • ????if(?iszero(a)?||?iszero(b)?)??
  • ????????return?0;??
  • ????if(?ispos(a)?&&?ispos(b)?)??
  • ????????return?Pos_Multiply(a,?b);??
  • ????if(?isneg(a)?)??
  • ????{??
  • ????????if(?isneg(b)?)??
  • ????????{??
  • ????????????return?Pos_Multiply(?negtive(a),?negtive(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?ans=0;??
  • ????for(int?i=31;i>=0;i--)??
  • ????{??
  • ????????//比較x是否大于y的(1<<i)次方,避免將x與(y<<i)比較,因為不確定y的(1<<i)次方是否溢出??
  • ????????if((x>>i)>=y)??
  • ????????{??
  • ????????????ans+=(1<<i);??
  • ????????????x-=(y<<i);??
  • ????????}??
  • ????}??
  • ????return?ans;??
  • }??
  • ??
  • //除法運算??
  • int?MyDiv(?int?a,?int?b?)??
  • {??
  • ????if(?iszero(b)?)??
  • ????{??
  • ????????cout?<<?"Error"?<<?endl;??
  • ????????exit(1);??
  • ????}??
  • ????if(?iszero(a)?)??
  • ????????return?0;??
  • ????if(?ispos(a)?)??
  • ????{??
  • ????????if(?ispos(b)?)??
  • ????????????return?Pos_Div(a,?b);??
  • ????????return?negtive(?Pos_Div(?a,?negtive(b))?);??
  • ????}??
  • ????if(?ispos(b)?)??
  • ????????return?negtive(?Pos_Div(?negtive(a),?b?)?);??
  • ????return?Pos_Div(?negtive(a),?negtive(b)?);??
  • }???
  • ??
  • ??
  • //?比較兩個正數的大小(非負也可)???
  • int?isbig_pos(?int?a,?int?b?)???
  • {??//a>b>0??
  • ????int?c?=?1;??
  • ????b?=?(a^b);??
  • ????if(?iszero(b)?)??
  • ????????return?0;??
  • ????while(?b?>>=?1?)??
  • ????{??
  • ????????c?<<=?1;??
  • ????}??
  • ????return?(c&a);??
  • }???
  • ??
  • //?比較兩個數的大小???
  • int?isbig(?int?a,?int?b?)???
  • {?//a>b??
  • ????if(?isneg(a)?)??
  • ????{??
  • ????????if(?isneg(b)?)??
  • ????????{??
  • ????????????return?isbig_pos(?negtive(b),?negtive(a)?);??
  • ????????}??
  • ????????return?0;??
  • ????}??
  • ????if(?isneg(b)?)??
  • ????????return?1;??
  • ????return?isbig_pos(a,?b);??
  • }??
  • 擴展:在不使用*、/、+、-、%操作符的情況下,如何求一個數的1/3?(用C語言實現)
    使用位操作符并實現“+”操作
    [cpp]?view plaincopy
  • //?替換加法運算符??
  • int?add(int?x?,?int?y)??
  • {??
  • ????int?res;??
  • ????while(y)???????//?直到沒有進位??
  • ????{??
  • ????????res?=?x^y;???????//?不帶進位的加法??
  • ????????y?=?((x&y)<<1);??//?進位??
  • ????????x?=?res;??
  • ????}??
  • ????return?x;??
  • }??
  • ??
  • int?divideby3(int?num)??
  • {??
  • ????int?sum?=?0;??
  • ????while(num?>?3)??
  • ????{??
  • ????????sum?=?add(num>>2?,?sum);??
  • ????????num?=?add(num>>2?,?num&3);??
  • ????}??
  • ????if(num?==?3)??
  • ????????sum?=?add(sum?,?1);??
  • ????return?sum;??
  • }??

  • 原理:n = 4 * a + b; n / 3 = a + (a + b) / 3; 然后 sum += a, n = a + b 并迭代; 當 a == 0 (n < 4)時,sum += floor(n / 3); i.e. 1, if n == 3, else 0

    總結

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

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