Java中的七种位运算
1.位与运算符(&)
运算规则:两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。
比如:130&129.
130转换成二进制就是10000010,129转换成二进制就是10000001。从高位开始比较得到,得到10000000,即128.
2.位非运算符(~)
运算规则:如果当前位为0,结果是1,如果当前位为1,结果是0.
比如:~36
在Java中,所有数据的表示方法都是以补码的形式表示,如果没有特殊说明,Java中的数据类型默认是int,int数据类型的长度是8位,一位是四个字节,就是32字节,32bit.
八进制转为二进制是100100.
补码后为: 00000000 00000000 00000000 00100100
取反为: 11111111 11111111 11111111 11011011
因为高位是1,所以原码为负数,负数的补码是其绝对值的原码取反,末尾再加1。
因此,我们可将这个二进制数的补码进行还原: 首先,末尾减1得反码:11111111 11111111 11111111 11011010 其次,将各位取反得原码:
00000000 00000000 00000000 00100101,此时二进制转原码为37
所以~36 = -37
3.位或运算符(|)
运算规则:两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。
比如:130|129.
130转换成二进制就是10000010,129转换成二进制就是10000001。从高位开始比较得到,得到10000011,即131.
4.位异或运算(^)
运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。
比如:6^8.
8转为二进制是1000,6转为二进制是0110.从高位开始比较得到的是:0001.然后二进制转为十进制,就是1;
5、<< 左移
两个左尖括号表示左移运算符,运算符规则是:各二进位全部左移若干位,高位丢弃,低位补0。
例如:6 << 2 = 24
0000 0000 0000 0000 0000 0000 0000 0110 -> 6
0000 0000 0000 0000 0000 0000 0001 1000 -> 6 << 2 = 24
- 我们将6的二进位向左移动两位,低位补上两个0,高位丢弃,得出来的结果就是24。 左移常被用来做 * (2 ^ n)的运算,因为直接基于二进制运算,所以左移效率比 * (2 ^ n)高。
6、>>右移
两个右尖括号表示右移运算符,运算符规则是:各二进位全部右移若干位,正数高位补0,负数高位补1,低位丢弃。
例如: 12 >> 2 = 3
0000 0000 0000 0000 0000 0000 0000 1100 -> 12
0000 0000 0000 0000 0000 0000 0000 0011 -> 12 >> 2 = 3
- 因为12是正数,右移过程中高位补上两个0,低位丢弃,得出来的结果就是3。 例如:-12 >> 2 = -3
这里简单介绍一下:原码、反码、补码
- 原码 是一个整数按照绝对值大小转换成的二进制数
- 反码 说白了就是原码反着来
- 补码 = 反码 +1
- 补码就是负数在计算机中的二进制表示方法
那么-12在二进制中怎么标识呢?
原码
0000 0000 0000 0000 0000 0000 0000 1100
反码
1111 1111 1111 1111 1111 1111 1111 0011
补码 = 反码+1
1111 1111 1111 1111 1111 1111 1111 0100
- 所以-12在二进制中的代码为
1111 1111 1111 1111 1111 1111 1111 0100
其实也可以通过(原码-1)取其反码,即可得到-12的二进制码
跑题了,咱们接着说回右移操作 -12 >> 2 = -3
1111 1111 1111 1111 1111 1111 1111 0100 -> -12
1111 1111 1111 1111 1111 1111 1111 1101 -> -12 >> 2 = -3
因为-12是负数,右移过程中高位补上两个1,低位丢弃,得出来的结果就是-3。 右移常被用来做 / (2 ^ n)的运算,因为直接基于二进制运算,所以右移效率比 / (2 ^ n)高。
7、>>>无符号右移
三个右尖括号表示无符号右移运算符,运算符规则是:各二进位全部右移若干位,高位补0,低位丢弃。
其实无符合右移和右移的区别就是不用关心是正数还是负数,右移时高位都补0。
例如: 12 >>> 2 = 3
0000 0000 0000 0000 0000 0000 0000 1100 -> 12
0000 0000 0000 0000 0000 0000 0000 0011 -> 12 >>> 2 = 3
- 我们将12的二进位向右移动两位,高位补上两个0,低位丢弃,得出来的结果就是3。 例如:-12 >>> 2 = 1073741821
1111 1111 1111 1111 1111 1111 1111 0100 -> -12
0011 1111 1111 1111 1111 1111 1111 1101 -> -12 >> 2 = 1073741821
我们将-12的二进位向右移动两位,高位补上两个0,低位丢弃,得出来的结果就是1073741821。