位运算
1、按位与(&)
参加运算的两个数,换算为二进制(0、1)后,进行与运算。只有当相应位上的数都是1时,该位才取1,否则该为为0。
`将10与-10进行按位与(&)运算:
0000 0000 0000 1010
1111 1111 1111 0110
---------------------------
0000 0000 0000 0010
所以:10 & -10 = 0000 0000 0000 0010
2、按位或(|)
参加运算的两个数,换算为二进制(0、1)后,进行或运算。只要相应位上存在1,那么该位就取1,均不为1,即为0。
`将10与-10进行按位或(|)运算:、
0000 0000 0000 1010
1111 1111 1111 0110
-----------------------
1111 1111 1111 1110
所以:10 | -10 = 1111 1111 1111 1110`
3、按位异或(^)
参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当相应位上的数字不相同时,该为才取1,若相同,即为0。
`将10与-10进行按位异或(^)运算:
``0000 0000 0000 1010
``1111 1111 1111 0110
``-----------------------
``1111 1111 1111 1100
``所以:10 ^ -10 = 1111 1111 1111 1100
可以看出,任何数与0异或,结果都是其本身。对同一个数异或两次得到本身。
利用异或还可以实现一个很好的交换算法,用于交换两个数,算法如下:
`a = a ^ b;
``b = b ^ a;
``a = a ^ b;`
4、取反(~)
参加运算的两个数,换算为二进制(0、1)后,进行取反运算。每个位上都取相反值,1变成0,0变成1。
`对10进行取反(~)运算:
``0000 0000 0000 1010
``---------------------
``1111 1111 1111 0101
``所以:~10 的补码为 1111 1111 1111 0101再取反+1得到原码
5、左移(<<)
参加运算的两个数,换算为二进制(0、1)后,进行左移运算,用来将一个数各二进制位全部向左移动若干位。
`对10左移2位(就相当于在右边加2个0):
``0000 0000 0000 1010
``--------------------
``0000 0000 0010 1000
``所以:10 << 2 = 0000 0000 0010 1000 = 40`
注意,观察可以发现,左移一位的结果就是原值乘2,左移两位的结果就是原值乘4。
6、右移(>>)
参加运算的两个数,换算为二进制(0、1)后,进行右移运算,用来将一个数各二进制位全部向右移动若干位。
`对10右移2位(就相当于在左边加2个0):
``0000 0000 0000 1010
``--------------------
``0000 0000 0000 0010
``所以:10 >> 2 = 0000 0000 0000 0010 = 2`
注意,观察可以发现,右移一位的结果就是原值除2,左移两位的结果就是原值除4,注意哦,除了以后没有小数位的,都是取整。