概述
在计算机中,CPU对数据进行操作都是对二进制数据进行操作。例如以下代码
int a = 4;
int b = 5;
int c = a + b;
实际上在CPU中是以二进制数据进行操作,所以在代码中使用位运算符能够提高代码执行效率。
+ a 0000 0100 4
b 0000 0101 5
-----------------
c 0000 1001 9
位运算符
位运算符有6种,各个运算符符号,描述和预算规则如下表:
符号 | 描述 | 运算规则 |
& | 与 | 两个都为1时,结果为1 |
| | 或 | 两个都为0时,结果为0 |
^ | 异或 | 两个相同为0,不同为1 |
~ | 取反 | 0取1,1取0 |
<< | 左移 | 所有位左移若干位,低位补0 |
>> | 右移 | 所有位右移若干位,高位补0(有符号位一般高位补符号位 |
&与运算符
0&0=0 0&1=0 1&0=0 1&1=1
结论:两位同时为1,结果为1,否则结果为0。 例如:3&5即 0000 0011& 0000 0101 = 0000 0001,因此 3&5 的值得1。 与运算应用:
(1)清零:如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
(2)取数:如果想要取出某个数的某几位,只需要将这个数和一个这几位为1,其余为0的数相与。例如:要取0110 1110的后四位,只需要将这个数和0000 1111相与得到的结果0000 1110就是想取数的后四位。
(3)判断奇偶:奇偶数只用判断最后是否为1即可所以只用将数a&1==0即可判断是否为偶数。
|或运算符
0|0=0 0|1=1 1|0=1 1|1=1
结论:两位只要有1位为1,结果为1,否则结果为0。 例如:3|5即 0000 0011| 0000 0101 = 0000 0111,因此 3|5 的值得7。 或运算应用:
(1)置1:如果想要将某个数的某几位设置为1,只需要将这个数和一个这几位为1,其余为0的数相或。例如:要将1011 1100的后四位设置为1,只需要将这个数和0000 1111相或得到结果为1011 1111就是想要的结果。
^异或运算符
0^0=0 0|1=1 1|0=1 1|1=0
结论:两位只要相同为0,不同为1。 例如:3^5即 0000 0011^ 0000 0101 = 0000 0110,因此 3^5 的值得6。 异或运算应用:
(1)翻转:如果想要将某个数的某几位翻转,只需要将这个数和一个这几位为1,其余为0的数相异或。例如:要将1011 1100的后四位翻转,只需要将这个数和0000 1111相异或得到结果为1011 0011就是想要的结果。
(2)与0相异或值不变。例如1011 1101 ^ 0000 0000 = 1011 1101。
异或的几条性质:
- 1、交换律
- 2、结合律 (a^b)^c == a^(b^c)
- 3、对于任何数x,都有 x^x=0,x^0=x
- 4、自反性: a^b^b=a^0=a;
~取反运算符
~0=1 ~1=0
结论:0变1,1变0。 取反运算应用:
(1)最低位置0:使a的最低位为0,可以表示为:a & ~1。对1取反就是最后一位变为0,其他位变1 ,再和a相与,就是a的最后一位为0,其他位不变。
<<左移运算符
定义:将一个数据的所有二进制位向左移动若干位,移动规则为:左边的高位丢弃,右边的二进制位补0。例如对一个数 a = 0011 1010 ,对a进行 a= a<<2;则得到的a就是a=1110 1000。如果在向左移动的过程中,舍弃的高位没有1,则每向左移动一位,相当于将原来的数乘以2。
>>左移运算符
定义:将一个数据的所有二进制位向右移动若干位,移动规则为:右边的低位丢弃,左边的二进制位补0。例如对一个数 a = 0011 1010 ,对a进行 a= a>>2;则得到的a就是a=0000 1110。如果在向右移动的过程中,每向右移动一位,相当于将原来的数除以2。注意如果是无符号数据:最左边的二进制位补0,如果是有符号的二进制位,最左边的二进制位补符号位,原来是多少就补多少。
对菜鸟教程的博客进行了整理:位运算(&、|、^、~、>>、 | 菜鸟教程 (runoob.com)