位操作符详解

我们所学的计算机编程中,位操作符占据着相关重要的角色,它们可以直接对整数的二进制位进行操作,让代码更加的紧凑和高效,下面我们具体来说明一下它们。

常用的位操作符有这几个:"&"(按位与),"|(按位或)","^(按位异或)","~(按位非)","<<(左移)",">>(右移)"。我们来分别说明这几个,但是会用到原码,反码和补码的知识,不懂得同学可以翻阅我上篇博客,里面有关于它们的说明。OK,我们开始。

一"&(按位与)"

按位与操作符将两个数的二进制表示进行逐位比较,两相同位为1是,结果取1,反之取0,直接上例子

13的二进制表示:1101
3的二进制表示:  0011
12&3=          0001

在计算机中我们定义整数类型的时候一般用int,但是int类型有32个比特位,这样表示

int a=1;
//其实a是这样存储的:00000000 00000000 00000001

一下我们只是说明所以不会写的这么全面。

二"|(按位或)"

按位或操作符将两个数的二进制表示进行逐位比较,只要两比较位中有一个为1,则结果取1,反之取0,上例子。

13的二进制表示:1101
3的二进制表示: 0011
12|3=          1111

三"^(按位异或)"

按位异或操作符将两个数的二进制表示进行逐位比较,当两个相应位不同时,结果取1,反之取0,上例子(题外话 我们需了解的是 a^a=0,a^0=a,大家可以自己动手验证一下。)

13:   1101
3:    0011
13^3=  1110

四"~(按位非)"

按位非只有一个操作数,它直接将二进制表示的数每位取反,即0变为1,1变为0。

13: 1101
~13:0010

五"<<(左移)"

左移操作符将第一个数的二进制表示向左移动指定位数,左移之后,右边空出的位用0填充。

13:     1101
//13左移两位
13<<2:1101 00

在左移过程中符号位位最高位,所以它左移过程符号我们通常无需担心例如

//32位的有符号整数-8
11111111 11111111 11111111 11111000
//-8<<2
11111111 11111111 11111111 11100000//符号不变

六">>(右移)"

右移操作符将第一个数的二进制表示右移动指定位数,左边空出的位用0填充(逻辑右移)或有符号位填充(算术右移)。

先逻辑右移例子

//-8的32位二进制表示
11111111 11111111 1111111 11111000
//-8>>2
00111111 11111111 1111111 11111110

我们会发现当它为负数的时候逻辑右移会导致符号发生变化,所以逻辑右移一般用于无符号整数。

算术右移例子

//同样-8
11111111 11111111 11111111 11111000
//同样右移两位
11111111 11111111 11111111 11111110
//当为8时
00000000 00000000 00000000 00001000
//8>>2
00000000 00000000 00000000 00000010  

七 应用

在一些情况下我们可以利用这些知识解决一些问题,例如乘法和除法

int a=3;
int b=2;
int c=(a<<1)+b;//等于a*2+b
int e=b>>1;//等于c/2

还有一些其他应用,例如不用设第三个量,实现两数交换,我们可以利用此知识来解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值