美文网首页C++面试题集C++
正整数除法与加法的位运算实现

正整数除法与加法的位运算实现

作者: saviochen | 来源:发表于2017-07-23 09:26 被阅读30次

方法1:依次减去除数

最常规的是按照除法的性质,依次将被除数减去除数,直到余数小于除数为止,由于复杂度太大。不重点讨论

方法2:递归位运算

每一次递归中,将除数通过移位依次乘以2。当被除数小于除数时,退出循环,此时将除数后退一步(初以2,保证除数小于当前被除数),继续递归。

 int div2(int x, int y){
     if(y == 0 || x < y)
         return 0;
     int k = 0;
     int cur = y;
     for(; x >= cur; cur <<= 1, ++k){
         if(x - cur < y)//只比原除数大一倍不到,直接返回移位除数
             return 1<<k;
     }
     return div2(x-(cur>>1), y) + (1 << (k-1));
 }

方法3:迭代位运算

思路与方法2相同,不过是用迭代实现的。

 int div3(int x, int y){
     int left = x;  //剩余的被除数
     int res = 0;  //结果
     while(left >= y){
        int multi = 1;
        while(y * multi <= (left >> 1) ){
            multi = multi<<1;
        }  //退出循环时,left/2 < y*multi <=left
        res += multi;
        left -= y*multi;
     }
     return res;
 }

引申:如何用逻辑运算实现加法

递归求解,当进位为0时,退出递归。

int add(int x, int y){
    if(y == 0)
        return x;
    int sumTemp = x ^ y;
    int carry = (x & y) << 1;
    return add(sumTemp, carry);
}

相关文章

网友评论

    本文标题:正整数除法与加法的位运算实现

    本文链接:https://www.haomeiwen.com/subject/fgbpkxtx.html