首先 我们先来了解下什么叫位运算。程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。
常用的几种位运算
1.与(&)and
效果:
当倆个数在二进制对应位数上均为1时 ,该位得1,否则出0
例
7& 11
0000 0111 ->7
0000 1011 ->11
0000 0011 ->3
7&11=3
2.或(|)or
效果:
当倆个数在二进制对应位上有一个是1时,该位得1,否则出0
例
7 | 11
0000 0111 ->7
0000 1011 ->11
0000 1111 ->15
7 | 11=15
3.异或(^)xor
效果:
当倆个数在二进制对应位上不同时出1,否则出0
例
7 ^ 11
0000 0111 ->7
0000 1011 ->11
0000 1100 ->12
7^11=12
4.左移(<<)
效果:
将二进制整体向左移动 不足的地方用0补充
例:
7<<1
0000 0111 ->7
0000 1110 ->14
7<<1=14
5.右移(>>)
效果:
将二进制整体向右移动 不足的地方用0补充
7<<1
0000 0111 ->7
0000 0011 ->3
7>>1=3
位运算在某些情况下可以帮助我们更快的得到我们想要的结果,并节约代码量。
比如说
我们希望知道某一个字母在字母表中的顺序,不论大小写。正常的思路是不是先判断该字母的大小写,然后用他的ASCII去减去'a'或者'A'的ascii码得出答案,但是用位运算就十分简单了。字母'A'的ASCII码是41H(0100 0001B),字母'a'的ASCII码是61H(0110 0001B),字母'A'与'a'的二进制后5位是相同的,所以无论是大写字母还是小写字母x,x &31(1 1111B)的值就是x在字母表里的顺序。所以之前一大堆的代码就可以直接简化为x(某个字母)&31就完事了。
再比如
给你一组整型数据,这些数据中,其中有一个数只出现了一次,其他的数都出现了两次,让你来找出一个数 。正常做的话dddd,挺麻烦的。但是用' ^' 就会变的十分简单了。由上述异或的效果可以得出两个相同的数异或的结果是 0,一个数和 0 异或的结果是它本身,所以这道题只需要将所有的数据进行异或最后得到的结果就是我们要的答案啦。
代码如下
int find(int[] arr){
int tmp = arr[0];
for(int i = 1;i < arr.length; i++){
tmp = tmp ^ arr[i];
} return tmp;
}
yjq