美文网首页C/C++学习笔记
位运算知识点复习、位运算实现加减乘除

位运算知识点复习、位运算实现加减乘除

作者: 零岁的我 | 来源:发表于2020-05-16 13:11 被阅读0次

    一、位运算符

    按位与 按位或 按位异或 按位取反 按位左移 按位右移
    a&b a|b ^ ~a a<<1 a>>1

    二、位运算实践

    1. 位运算实现加法运算
    在不考虑进位的情况下,按位异或与运算相当于二进制下的加法运算,如下所示:

    普通加法 异或运算
    1+1=0 1^1=0
    1+0=1 1^0=1
    0+1=1 0^1=1
    0+0=0 0^0=0

    那么怎么判断需不需要进位呢?

    与运算
    1&1=1 (进位)
    1&0=0 (不进位)
    0&1=0 (不进位)
    0&0=0 (不进位)

    正好,在位运算中,用“<<”实现向左移动一位,也就是“进位”。那么我们就可以得到如下的表达式

    (x&y)<<1

    至此就可以实现不用+号的加法运算了

    x^y
    (x&y)<<1

    当然以上两个表达式需要放在循环体中,直到不产生进位时,才退出循环,具体实现如下:

    int add(int num1,int num2)
    {
        int sum=0;
        int carry=0;
        do{
            sum = num1^num2;
            carry = (num1&num2)<<1;
            num1 = sum;
            num2 = carry;
        }while(carry != 0);
        return sum;
    }
    

    2. 位运算实现减法
    a-b相当于a加上b的相反数,因此可以将减法转换成加法。
    在计算机系统中,数值一律用补码来表示和存储。但是正数的补码就是其原码本身,例如:8的二进制形式为0000 1000,在计算机中8也是以0000 1000的形式存在,而-8的二进制形式为1000 1000,在计算机中的存储表示为1111 1000,即将1000 1000除符号位以外的其他未取反后+1得到。因此有:
    8-8= 8 +(-8)=0000 1000 + 1111 1000 = 0;

    int subtract(int num1,int num2)
    {
        int complement=add(~num2,1); //求num2的补码,取反+1
        int differ=add(num1,complement); //
        return differ;
    }
    

    还有乘除法,后续再补吧。
    参考链接:https://www.jianshu.com/p/7bba031b11e7

    相关文章

      网友评论

        本文标题:位运算知识点复习、位运算实现加减乘除

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