int main()
{
int num = 5;
int n = -6;
int c = n & num;
printf("n= %d\n", n);
printf("num= %d\n", num);
printf("c= %d\n", c);
return 0;
}
| //按位或:对应的二进制位上有1则为1,两个同时为0才为0
int main()
{
int num = 5;
int n = -6;
int c = n | num;
printf("n= %d\n", n);
printf("num= %d\n", num);
printf("c= %d\n", c);
return 0;
}
^ //按位异或:相应的二进制位上相同则为0,相异则为1
int main()
{
int num = 5;
int n = -6;
int c = n ^ num;
printf("n= %d\n", n);
printf("num= %d\n", num);
printf("c= %d\n", c);
return 0;
}
eg:不能创建临时变量(第三个变量),实现两个数的交换。
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n", a, b);
return 0;
}
~ //按位取反:二进制是0的变成1,是1的变成0
int main()
{
int n = -6;
int c = ~n;
printf("n= %d\n", n);
printf("c= %d\n", c);
return 0;
}
注:它们的操作数必须是整数。
eg:求⼀个整数存储在内存中的⼆进制中1的个数。
我们首先就可以联想到十进制中求1的个数,我们可以%10,/10,同样
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%2不可能为1,count就是0了。
我们就可以使用位操作符了,我们让num&1之后利用右移操作符就可以知道有多少个1了
#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;
}
6.单目操作符
单⽬操作符有这些:
!、++、--、&、*、+、-、~ 、sizeof、(类型) 单⽬操作符的特点是只有⼀个操作数。
&,*暂时不去讲解,会涉及到指针的内容。
7.逗号表达式
语法:
exp1, exp2, exp3, …expN
逗号表达式,就是⽤逗号隔开的多个表达式。
逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("%d", c);
return 0;
}