快速上手C语言位操作符& ^ ~ |

C语言中有许多操作符,今天我们来介绍一下位操作符。

废话不多讲,马上进入正题。

位操作符有:

1 &     //按位与

2 |      //按位或

3 ^     //按位异或

4 ~    //按位取反

 注:位操作符用来对二进制位补码进行操作。同时,操作数还必须是整数。

一 原码、反码、补码

首先为了更容易讲解,先简单介绍一下原码、反码、补码

3. 原码、反码、补码

构成:

有符号整数的三种表⽰⽅法均有 符号位 数值位 两部分,2进制序列中,最⾼位的1位是被当做符号
位,剩余的都是数值位。 符号位都是⽤0表⽰“正”,⽤1表⽰“负”。
例如:-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

转化规则:

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
例如-1:
原码: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语言位操作符介绍啦~~

我会在接下来的文章中更新它们多种妙用,还望多多支持哦。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值