美文网首页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

相关文章

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

    一、位运算符 按位与按位或按位异或按位取反按位左移按位右移a&ba|b^~aa<<1a>>1 二、位运算实践 1....

  • JS中的位移运算

    快速理解位运算: 位运算比其他运算(加减乘除)更加底层,所以运算的更快,但是不是所有场景都可以用 位运算只针对整数...

  • 位运算实现加减乘除

    一. 位运算的基本操作 A = 0011 1100B = 0000 1101 二. 加法 不考虑进位的按位求和, ...

  • 算术运算和逻辑运算

    算术运算和逻辑运算 算术运算:加减乘除等基本运算 逻辑运算: 逻辑与 &, 如 A &B ,AB同时位真才为真。 ...

  • 位运算加减乘除

    加法: carry = 进位 = AND xor = remains. 减法: The~operator flip...

  • 不用加减乘除运算符,求整数的7倍

    问题 不用加减乘除运算符,求整数的7倍 思路 当需要进行避免使用加减乘除的数学运算的时候,通常的方法有:位运算、E...

  • 第二十四节 Swift 高级运算符

    除了加减乘除运算符,常用的位运算符在 Swift里属于高级运算符。 其它的高级运算符还有移位运算符和溢出加法运算符...

  • 如何用位运算实现加减乘除

    由于位运算比普通的加减乘除效率要高很多,所以在在实际编程中应尽可能使用位运算代替加减乘除。以下总结我在编程中常用的...

  • 利用位运算来实现加减乘除

    1 加法我们现在关注二进制加法。发现一个特点。位的异或运算跟求'和'的结果一致: 异或 1^1=0 1^0=1 0...

  • 3、小众运算符の大课堂(一)

    较为简单の位运算符: & 位与运算| 位或运算^ 位异或运算~ 位取反运算 举例: 要做位运算,首先要把数据转...

网友评论

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

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