携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情
位操作符
位操作,有&(按位与) ,|(按位或),^(按位异或)~(按位取反)。
位操作符顾名思义,是针对二进制位的操作,有两个操作数进行,二进制位进行操作运算。
这里我们的二进制位都是指的补码,因为一个数以补码的形式存放在内存中。
// 00000000 00000000 00000000 00100010
// 00000000 00000000 00000000 11010110
// & 00000000 00000000 00000000 00000010
// | 00000000 00000000 00000000 11110110
// ^ 00000000 00000000 00000000 11110100
| 位操作符 | 作用 | |
|---|---|---|
& | 两操作数二进制位都为真(1)结果为真(1)否者为假(0) | |
| ` | ` | 两操作数二进制位为假(0)结果为假(0)否者为真(1) |
^ | 一真(1)一假(0)结果为真(1),否者为假(0) | |
~ | 二进制位按位取反,1变0,0变1 |
位操作符的应用
//尝试写一下这个代码
include <stdio.h>
int main()
{
int num1 = 1; //00000000 00000000 00000000 00000001
int num2 = 2; //00000000 00000000 00000000 00000010
num1 & num2; // 00000000 00000000 00000000 00000000
num1 | num2; // 00000000 00000000 00000000 00000011
num1 ^ num2; // 00000000 00000000 00000000 00000011
return 0;
}
一道面试题小试牛刀
不创建新的变量,实现两个变量的交换。
//方法一
#include<stdio.h>
int main()
{
int a=3; // 00000000 00000000 00000000 00000011
int b=5; // 00000000 00000000 00000000 00000101
a=a^b; // 00000000 00000000 00000000 00000110
b=a^b; // 00000000 00000000 00000000 00000011
a=a^b; // 00000000 00000000 00000000 00000101
}
有趣的一道代码,利用^按位异或实现了两数的交换。
^异或操作符的性质
a^a=0;
a^0=a;
经常利用这两条性质解题,写出优秀的代码!
//方法二
#include<stdio.h>
int main()
{
int a=3;
int b=5;
a=a+b; //a=8
b=a-b; // b=3
a=a-b; // a=5
}
求一个整数存储在内存中二进制1的个数
//方法一
#include<stdio.h>
int main()
{
int n=10;
int count=0;
while(n)
{
if(n%2==1)
{
count++;
}
n>>=1;
}
printf("输入二进制位1的个数:%d",count);
}
思考上面的代码是否存在问题
当
n为负数时?
可以看到程序将会一直死循环下去。
我们优化一下!
//方法二
#include<stdio.h>
int main()
{
int i=0;
int count=0;
int num=-3;
for(i=0;i<32;i++)
{
if((num>>i)&1==1) //移位并且判断最后一位是否为1
count++;
}
return 0;
}
每次都要进行32次循环,我们是否可以再次优化一下!
//方法三
#include <stdio.h>
int main()
{
int num = -1; // 10000000 00000000 00000000 00000001
//补码 11111111 11111111 11111111 11111111
int i = 0;
int count = 0;//计数
while(num)
{
count++;
num = num&(num-1);//丢弃最后一位1
}
printf("二进制中1的个数 = %d\n",count);
return 0;
}
上面这个代码是不是很神奇,一般人想不到,这就是代码的魅力!
赋值操作符
赋值操作符,我们再熟悉不过了。 我们可以通过赋值操作符,将一个变量改变成你想要的值!
#include<stdio.h>
int main()
{
int weight=180;
weight=125; //不满意可以改变
//连续赋值
int a=13,b=0,c=0;
a=b=c=6;
//连续赋值操作缺点不易调试
}
复合赋值操作符
+=-=*=/=%=.........
可以看到很多复合赋值操作符
a+=2; ===> a=a+2;
a*=3; ===> a=a*3;
//其他运算符一个道理
....
这边是复合赋值操作符,使用起来很简单,也很方便!