一.知识点

要了解c语言的位运算,首先要知道几个逻辑运算符:

  运算符 含义 描述
& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

简单的总结一下:

把1和0当作是电路开关的闭和开,那么逻辑与相当于串联,需要开关全部闭合才为1,即通路;

逻辑或相当于电路上的并联操作,只要有一个开关闭合就相当于电路通路,即为1,所以逻辑或就是有1为1,其他都为0

逻辑异或就是只要1和0同时出现,即使电路通路,为1,其他都为0

二.c语言的位运算加法

371. 两整数之和

给你两个整数 ab不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和。

int getSum(int a, int b)
{
    while(b)
    {
        unsigned int temp = (unsigned int)(a & b) << 1;
//逻辑与即用来判断是否需要进位,<<用来进位
        a = a ^ b;//逻辑异或即用来加
        b = temp;
    }
    return a;
}
计算2+3=?
     0010
and  0011
-----------
     0010
再向左移一位即变为0100
进行异或运算即相加
  0010
  0011
--------
  0001
  
我们首先用逻辑与判断是非需要进位,如果要进位将结果向左进一位,得出的结果是0100
再进行异或运算相加,得到的结果为0001
最后将0100和0001进行异或运算即得到结果为0101

刚开始有点难理解,其实位运算加法的套路可以由上代码进行套取计算,相当于模板一样

与运算就是进位,异或就是相加。位运算的加法总的来说就是这两步,判断需要进位后用左移<<向前进位。