位操作符
在C语言中,位操作符包含以下六个:
- 按位非(取反) ~
- 按位与 &
- 按位或 |
- 按位异或 ^
- 左移 <<
- 右移 >>
既然是位操作符,在操作之前就需要将操作的数转化为电脑所需要的二进制位再进行运算,这里要注意的是,位操作符只能应用于char、int、short、long这些类型。
按位非(取反) ~
按位取反操作符是位操作符中唯一一个单目操作符,也是理解起来比较麻烦的操作符,所以放到第一位进行讲解,大家可以通过这个链接进行跳转。按位取反https://blog.csdn.net/weixin_61787820/article/details/125685186?spm=1001.2014.3001.5501
注意,要理解位操作符需要对原码、反码、补码有一定的了解(特别是负数,在位操作符的运算中都是以补码的形式参与的),而在按位取反的博客中对此有介绍和讲解,建议大家先行观看。
按位与 &
简单来说,按位与 就是将两个数的二进制位进行逐一比较,1代表真,0代表假,按位与 需要两个数的相同位置都为真才能得到真,其余情况都为假。
#include <stdio.h>
int main()
{
int a = -1;//11111111111111111111111111111111(补码)
int b = -2;//11111111111111111111111111111110(补码)
int c = a & b;//11111111111111111111111111111110 (补码)(都是真才真)
printf("%d", c);//-2
return 0;
}
按位或 |
按位或 和 按位与 相似,将两个数的二进制位进行逐一比较,1代表真,0代表假,按位或 仅需要两个数的相同位置有一个为真就能得到真,其余情况为假。
#include <stdio.h>
int main()
{
int a = -1;//11111111111111111111111111111111(补码)
int b = -2;//11111111111111111111111111111110(补码)
int c = a | b;//11111111111111111111111111111111 (补码)(一真就真)
printf("%d", c);//-1
return 0;
}
按位异或 ^
按位异或稍微特殊,将两个数的二进制位进行逐一比较,相同为0,不相同为1.
#include <stdio.h>
int main()
{
int a = -1;//11111111111111111111111111111111(补码)
int b = -2;//11111111111111111111111111111110(补码)
int c = a ^ b;//00000000000000000000000000000001 (补码)
printf("%d", c);//1
return 0;
}
左移 <<
左移是对二进制位进行移动,例如1的二进制位为00000000000000000000000000000001,
左移一位后,1到了倒数第二位,末位补0,即00000000000000000000000000000010.
右移 >>
右移相对特殊,不同的编译器有不同的情况,具体分为两种:
#include <stdio.h>
int main()
{
int a = -1;//11111111111111111111111111111111
int b = a >> 1;//二进制右移(注意有两种情况)
//算术右移
printf("%d", b);//符号位补原本符号 11111111111111111111111111111111
//逻辑右移
printf("%d", b);//符号位补0 01111111111111111111111111111111(正数原码、反码、补码相同)
return 0;
}
大家可以运行以下判断自己的编译器属于哪一种。
总结
位操作符的应用范围和一般的操作符相比较小,但是也是有独特的作用的,例如可以用于简单的密码加密;在不创建变量的情况下安全的交换两个数等等,更重要的是,它能帮助我们加深对电脑的理解。