一.知识点
要了解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语言的位运算加法
给你两个整数
a
和b
,不使用 运算符+
和-
,计算并返回两整数之和。
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
刚开始有点难理解,其实位运算加法的套路可以由上代码进行套取计算,相当于模板一样
与运算就是进位,异或就是相加。位运算的加法总的来说就是这两步,判断需要进位后用左移<<向前进位。