-
Java位运算符:Java的位运算符是把数字看作二进制来进行计算的。
- 按位与(&):如果存在两个二进制位都为1,则该位结果为1,否则为0
- 按位或(|):只要一个为1,则为1,否则为0
- 按位异或(^):两个二进制位相异为1,否则为0
- 取反(~):对数据的每个二进制位取反,即把1变0,把0变1
- 左移动(<<):运算数的各二进制位全部向左移动若干位,即乘以2的若干次方
- 右移动(>>):运算数的各二进制位全部向右移动若干位,即整除以2的若干次方
异或的数学规则
运算律:x^x=0, x^0=x
交换律:x^y ^z =x^z ^y -
实际例子
int a = 60; #60的二进制为 0011 1100 int b = 13; #13的二进制为 0000 1101 int c = 0; a&b: #结果为 0000 1100 a|b: #结果为 0011 1101 a^b: #结果为 0011 0001 -a: #结果为 1100 0011 a<<3: #结果为 1111 0000 0 a>>3: #结果为 0000 0111 System.out.println("二进制输出:":+Integer.toBinaryString(a&b)); System.out.println("八进制输出:"+Integer.toOctalString(a)); System.out.println("十六进制输出:"+Integer.toHexString(a));
负数的二进制表示
负数的二进制表示形式在计算机中,是以其正值的补码形式表示的。
- 原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。如:00000000 00000000 00000000 00000101 是 5的 原码。
- 反码:将二进制数(原码)按位取反(1变0,0变1),得到的新二进制数称为原二进制数的反码。如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
- 补码:所得反码加1。也就是说要得到一个数的补码,先得到反码再加1。
看看整数-1在计算机中如何表示。
- 先取1的原码:00000000 00000000 00000000 00000001
- 得反码:11111111 11111111 11111111 11111110
- 得补码:11111111 11111111 11111111 11111111
可见-1在计算机里面用二进制表达就是全1,16进制为:0xffffffff,根据-1的补码计算出实际十进制表示为:0xffffffff - 2**32