我们所学的计算机编程中,位操作符占据着相关重要的角色,它们可以直接对整数的二进制位进行操作,让代码更加的紧凑和高效,下面我们具体来说明一下它们。
常用的位操作符有这几个:"&"(按位与),"|(按位或)","^(按位异或)","~(按位非)","<<(左移)",">>(右移)"。我们来分别说明这几个,但是会用到原码,反码和补码的知识,不懂得同学可以翻阅我上篇博客,里面有关于它们的说明。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
还有一些其他应用,例如不用设第三个量,实现两数交换,我们可以利用此知识来解决。