【C语言】:巧用移位操作符,位操作符解决问题
目录
1.不能创建临时变量,实现两个整数的交换
方法一:加减减,竟可互换
方法二:巧用按位异或
2.求一个整数储存在内存的二进制中1的个数
方法一:“%”---“/” 两板斧
方法二:巧用左移操作符和按位与
方法三:n&(n-1)算法
1.不能创建临时变量,实现两个整数的交换
方法一:加减减,竟可互换
#include <stdio.h>int main()
{int a = 5;int b = 3;printf("交换前:a=%d,b=%d\n",a,b);a = a + b;b = a - b;a = a - b;printf("交换后:a=%d,b=%d\n",a,b);//当a,b足够小,但是a+b太大时,可能会溢出return 0;
}
注意:虽然这个方法可以符合要求的交换两个整数,但是有问题的,如果a与b非常大,但是没超出整型大小,然而a+b却有可能溢出,因此这个方法只能解决一部分的情况。
方法二:巧用按位异或
#include <stdio.h>int main()
{int a = 5;int b = 3;printf("交换前:a=%d,b=%d\n", a, b);//a^a=0//0^a=aa = a ^ b;b = a ^ b;//b=a^b^b=aa = a ^ b;//a=a^b^a=bprintf("交换后:a=%d,b=%d\n", a, b);//二进制相同位0,相异为1,并不会存在进位问题,所以不会有溢出return 0;
}
使用这个方法我们需要对按位异或运算有所认识,并