位运算实现四则运算

在学习位运算的时候,参考网上的一些方法,把位运算实现四则运算的一些代码都收集到这里来了,部分加以修改!!


计算机中对整数的表示大多是采用补码的方式。补充一下补码的知识:

[正整数] = [正整数]

[负整数] = [正整数] + 1 (保留符号位)

负整数补码的真值:对负整数的补码再求补码(保留符号位)

计算机中对负整数的表示是补码方式,所以对负整数求补得到对应的正整数(绝对值)!

[a+ b]=[ a] + [b]

[a – b ]   = [a]+ [-b] =[a]+ [b]+ 1



1、位运算实现的加法:

思路:

考虑一个普通的加法计算:5+17=22


在十进制加法中可以分为如下3步进行:

    1. 忽略进位,只做对应各位数字相加,得到12(个位上5+7=12,忽略进位,结果2);

    2. 记录进位,上一步计算中只有个位数字相加有进位1,进位值为10;

    3. 按照第1步中的方法将进位值与第1步结果相加,得到最终结果22。


下面考虑二进制数的情况(5=101,17=10001):

仍然分3步:

    1. 忽略进位,对应各位数字相加,得到10100;

    2. 记录进位,本例中只有最后一位相加时产生进位1,进位值为10(二进制);

    3. 按照第1步中的方法将进位值与第1步结果相加,得到最终结果10110,正好是十进制数22的二进制表示。


接下来把上述二进制加法3步计算法用位运算替换:

    第1步(忽略进位):0+0=0,0+1=1,1+0=1,1+1=0,典型的异或运算。

    第2步:很明显,只有1+1会向前产生进位1,相对于这一数位的进位值为10,而10=(1&1)<<1。

    第3步:将第1步和第2步得到的结果相加,其实又是在重复这2步,直到不再产生进位为止。


程序实现:

int Add(int a,int b){

    return b?Add(a^b,(a&b)<<1):a;

}

思路2:

看了很久才明白,狂汗。。。!! 按b的为1的二进制位,对a做位运算! a&j 确认第几位,a&~j  确认相加后为0,a|j 将进位数加至a中对应的位置!

程序实现2:

int MyAdd(int a,int b){     
    int i = 1;
    int j ;

    for( ;i;i <<= 1 ){
         if( b&i )  
            for( j = i;j;j<< = 1 ) 
                 if( a & j ) 
                    a &= ~j;
                 else{
                    a |= j;
                     break;
                } 
     }
    return a ;
 }

2、位运算实现的减法

a - b = a + (-b);

程序实现:

int negative(int a) {
      return ~a + 1;
  }
int Minus(int a, int b) {
      return Add(a, negative(b));
  }


3、位运算实现的乘法

计算机中只有二进制的加法,所以乘法也是依赖二进制加法实现乘法。

程序实现:

int Multi(int a, int b){
    int ans = 0;
    int isNeg = 0;

    if( isneg(b) ){
        isNeg = 1;
        b = ~b+1;
      }

    while(b){
        if(b&1)
            ans = Add(ans, a);
        a = a << 1;
        b = b >> 1;
      }
     return (isNeg)?~ans+1:ans;
  }

4、位运算实现的除法

在计算机中,除法是通过减法实现的。

int Divide(int a,int b){
    int coun = 0;
    int sign = 1;

    if( a & 0x8000 ){
        sign *= -1 ;
        a = ~a + 1;
    }

    if( b & 0x8000 ){
        sign *= -1;
        b = ~b + 1;
    }
  
    while( a >= b ){
        a = Minus(a,b);
        coun = Add(coun,1);
    }

    return ( sign== -1 )?~coun+1:coun;

 }

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值