C语言中有许多操作符,今天我们来介绍一下位操作符。
废话不多讲,马上进入正题。
位操作符有:
1 & //按位与
2 | //按位或
3 ^ //按位异或
4 ~ //按位取反
注:位操作符用来对二进制位补码进行操作。同时,操作数还必须是整数。
一 原码、反码、补码
首先为了更容易讲解,先简单介绍一下原码、反码、补码
3. 原码、反码、补码
构成:
例如:-1 11111111 11111111 11111111 11111111
1 00000000 00000000 00000000 00000001
正整数的原、反、补码都相同。负整数的三种表⽰⽅法各不相同。
整数1:
原码:0000000 00000000 00000000 00000001
反码:0000000 00000000 00000000 00000001
补码:0000000 00000000 00000000 00000001
负数-1:
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
转化规则:
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110(按位取反,符号位不变)
补码:11111111 11111111 11111111 11111111(反码加1)
补码得到原码也是可以使⽤:取反,+1的操作。
在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算 过程是相同的,不需要额外的硬件电路。
1、& 按位与
直接上代码:
#include<stdio.h>
int main()
{
int a = 5;
int b = -2;
int c = a & b;
printf("%d\n", c);
return 0;
运行结果为:4
这是怎么操作的呢,如下:
规则:两个二进制操作数对应位同为 1 ,结果位才为 1 ,其余情况为 0 。
先写出 5,-2 的补码
5 的补码:00000000 00000000 00000000 00000101
-2 的原码:10000000 00000000 00000000 00000010
-2 的反码:11111111 11111111 11111111 11111101
-2 的补码:11111111 11111111 11111111 11111110
5 & -2 的补码:00000000 00000000 00000000 00000100
2、| 按位或
先说规则:两个二进制操作数对应位只要有一个为 1 ,结果 位 就为 1 ,其余情况为 0
先写出 5,-2 的补码
5 的补码:00000000 00000000 00000000 00000101
-2 的原码:10000000 00000000 00000000 00000010
-2 的反码:11111111 11111111 11111111 11111101
-2 的补码:11111111 11111111 11111111 11111110
两个二进制操作数对应位只要有一个为 1 ,结果 位 就为 1 ,其余情况为 0
5 的补码:00000000 00000000 00000000 00000101
-2 的补码:11111111 11111111 11111111 11111110
5 | -2 的补码:11111111 11111111 11111111 11111111
此时得到的是补码,需要原码才能打印
5 | -2 的补码:11111111 11111111 11111111 11111111
5 | -2 的反码:11111111 11111111 11111111 11111110
5 | -2 的原码:10000000 00000000 00000000 00000001
此时打印结果是:-1
3、^按位异或
先说规则:两个二进制操作数对应 位 相同为 0 ,不同为 1
先写出 5,-2 的补码
5 的补码:00000000 00000000 00000000 00000101
-2 的原码:10000000 00000000 00000000 00000010
-2 的反码:11111111 11111111 11111111 11111101
-2 的补码:11111111 11111111 11111111 11111110
两个二进制操作数对应 位 相同为 0 ,不同为 1
5 的补码:00000000 00000000 00000000 00000101
-2 的补码:11111111 11111111 11111111 11111110
5 ^ -2 的补码:11111111 11111111 11111111 11111011
此时得到的是补码,需要原码才能打印
5 ^ -2 的补码:11111111 11111111 11111111 11111011
5 ^ -2 的反码:11111111 11111111 11111111 11111010
5 ^ -2 的原码:10000000 00000000 00000000 00000101
此时打印结果是:-5
4、~按位取反
规则:一个二进制操作数,对应位为 0 ,结果位为 1 ;对应位为 1 ,结果位为 0
作用是将每位二进制取反
先写出 5 的补码
5 的补码:00000000 00000000 00000000 00000101
对应位为 0 ,结果位为 1 ;对应位为1,结果位为 0
从而得到:
5 的补码:00000000 00000000 00000000 00000101
取反:11111111 11111111 11111111 11111010
此时得到的是补码,需要原码才能打印
取反后(补码):11111111 11111111 11111111 11111010
反码:11111111 11111111 11111111 11111001
原码:10000000 00000000 00000000 00000110
此时打印的结果是:-6
以上就是精简版的C语言位操作符介绍啦~~
我会在接下来的文章中更新它们多种妙用,还望多多支持哦。