位运算不管是在Java语言,还是在C语言中,或者其他语言,都是经常会用到的,原始点就从0、1开始。

位运算位运算主要包括:

  • 按位与(&)
  • 按位或(|)
  • 按位异或(^)
  • 取反(~)
  • 左移(<<)
  • 右移(>>)这几种

其中除了取反(~)以外,其他的都是二目运算符,即要求运算符左右两侧均有一个运算量。

基础学习:补码

在总结按位运算前,有必要先介绍下补码的知识,我们知道当将一个十进制正整数转换为二进制数的时候,只需要通过除2取余的方法即可,但是怎么将一个十进制的负整数转换为二进制数呢?其实,负数是以补码的形式表示,其转换方式,简单的一句话就是:先按正数转换,然后取反加1。

1
2
3
4
5
6
7
要将十进制的-10用二进制表示,先将10用二进制表示:
0000 0000 0000 1010
取反:
1111 1111 1111 0101
加1:
1111 1111 1111 0110
所以,-10的二进制表示就是:1111 1111 1111 0110

位运算:按位异或(^)

参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当相应位上的数字不相同时,该为才取1,若相同,即为0。

1
2
3
4
5
6
将10与-10进行按位异或(^)运算:
0000 0000 0000 1010
1111 1111 1111 0110
-----------------------
1111 1111 1111 1100
所以:10 ^ -10 = 1111 1111 1111 1100

可以看出,任何数与0异或,结果都是其本身。利用异或还可以实现一个很好的交换算法,用于交换两个数,算法如下:

1
2
3
a = a ^ b;
b = b ^ a;
a = a ^ b;

我们可以思考一下这个的原理: