4. 位操作符
& 按(二进制)位与 相异为0
| 按(二进制)位或 相异为1
^ 按(二进制)位异或 相同为0,相异为1
注:他们的操作数必须是整数。
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
int x = a & b;
int y = a | b;
int z = a ^ b;
printf("%d\n", x);
printf("%d\n", y);
printf("%d\n", z);
return 0;
}
练习:
1.不能创建临时变量(第三个变量),实现两个数的交换
#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("交换前:a=%d b=%d\n", a, b);
//方法一(有溢出的问题)
//a = a + b;
//b = a - b;
//a = a - b;
//方法二
// ^ 满足交换律
//3^0=3
//3^3=0
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换前:a=%d b=%d\n", a, b);
//但事实上创建临时变量,效率会更高
return 0;
}
2.求一个整数存储在内存中的二进制中1的个数
方法1
#include <stdio.h>
int main()
{
int num = 10;
int count = 0;//计数
while (num)
{
if (num % 2 == 1)
count++;
num = num / 2;
}
printf("二进制中1的个数 = %d\n", count);
return 0;
}
注:当num为负数时就不适用了
方法二
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
for (i = 0; i < 32; i++)
{
if (num & (1 << i))
count++;
}
printf("二进制中1的个数 = %d\n", count);
return 0;
}
注:这里要循环32次,还可以继续优化
方法三
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
while (num)
{
count++;
num = num & (num - 1);
}
printf("二进制中1的个数 = %d\n", count);
return 0;
}