Java 与(&)、或(|)、异或(^)、非(~)位运算符
偶尔看源码,经常遇见这些运算符,记录下这些运算符的使用,强化下记忆。
位运算符主要用于二进制,因此下面都会将数字转为二进制来举例。
与运算符(&)
“&”运算符是当二进制相同位都为1时,则为1,存在为0的,则为0
以 *3&5* 为例,转换为二进制为:
3 ---> 00000000 00000000 00000000 00000011
5 ---> 00000000 00000000 00000000 00000101
“&”后的结果为 00000000 00000000 00000000 00000001 = 1
或运算符(|)
“|”运算符是当二进制相同位有一个1时,则为1
以 *3|5* 为例,转换为二进制为:
3 ---> 00000000 00000000 00000000 00000011
5 ---> 00000000 00000000 00000000 00000101
“|”后的结果为 00000000 00000000 00000000 00000111 = 7
异或运算符(^)
“^”运算符是当二进制向相同位的值相同时,则为0,否则为1
以 *3^5* 为例,转换为二进制为:
3 ---> 00000000 00000000 00000000 00000011
5 ---> 00000000 00000000 00000000 00000101
“^”后的结果为 00000000 00000000 00000000 00000110 = 6
非运算符(~)
“~”运算符是将二进制中1替换为0,0替换为1即可
以~3为例
3 ---> 00000000 00000000 00000000 00000011
~3 ---> 11111111 11111111 11111111 11111100
二进制的高位为1,所以是负数,在Java中,所有数据的表示方法都是以补码的形式表示,正数的原码等于补码,
负数的补码是其绝对值的原码取反,末尾再加1,因此我们需要将补码转换为原码:
先减1:
11111111 11111111 11111111 11111011
再取反:
00000000 00000000 00000000 00000100
得出值为4, 则
~3 = -4
附: 二进制快速运算方法
二进制的每一位的1都是对应了2的次方,从右到左,由0次方开始递增,计算时可以用这个规律,如:
00000000 00000000 00000000 00001011
采用该算法计算规则为: 2^0 + 2^1 + 2^3 = 11 (此处^代表次方,没找到怎么打出来.....)
数字如何快速转换为二进制,直接对数字一直除2,直到商为0,将每次的余数倒排,就能得到相应的二进制,如:
将16转换为2进制:
16/2 = 8 余数为 0
8/2 = 4 余数为 0
4/2 = 2 余数为 0
2/2 = 1 余数为 0
1/2 = 0 余数为 1 次数商已经为0了,直接停止
倒排余数得到 10000
此法为短除法,可以用于其他进制的转换