一.知识点
要了解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. 两整数之和
给你两个整数
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=?0010and 0011-----------0010再向左移一位即变为0100进行异或运算即相加00100011--------0001我们首先用逻辑与判断是非需要进位,如果要进位将结果向左进一位,得出的结果是0100再进行异或运算相加,得到的结果为0001最后将0100和0001进行异或运算即得到结果为0101
刚开始有点难理解,其实位运算加法的套路可以由上代码进行套取计算,相当于模板一样
与运算就是进位,异或就是相加。位运算的加法总的来说就是这两步,判断需要进位后用左移<<向前进位。