位运算符
-
java中负数的表示
-
简单来讲,java中负数的二进制表示是其绝对值取反+1
-
例:int类型的-5怎么表示
5 --> 0000 0000 0000 0000 0000 0000 0000 0101
取反 --> 1111 1111 1111 1111 1111 1111 1111 1010
+1 --> 1111 1111 1111 1111 1111 1111 1111 1011
所以-5的表示是:1111 1111 1111 1111 1111 1111 1111 1011 -
实际上,java中的负数是由其补码来表示(原码,反码,补码)
-
在计算机中,对于正数,原码,反码,补码都是本身;负数的反码是在原码基础上,符号位不变,其余各位取反,负数的补码则在反码的基础上+1;
-
如:
一个8位的-1原码为1000 0001(最高位表示符号,0为正1为负)
则-1的反码为1111 1110(即符号位不变,其余各位取反)
则-1的补码为1111 1111
所以一个byte类型的-1在java中表示是1111 1111
-
-
左移右移
- << 左移
- >> 右移
- >>> 带符号右移
- 实例:
int i = 5; int j = -5; String s = Integer.toBinaryString(i);//得到i的二进制数 String s1 = Integer.toBinaryString(j); System.out.println(s);//101 System.out.println(s1);//11111111111111111111111111111011 //正数右移高位补0,负数带符号右移高位补1,不带符号右移高位补0 System.out.println(i>>2);//1 System.out.println(j>>2);//-2 System.out.println(Integer.toBinaryString(j>>2));//11111111111111111111111111111110 System.out.println(j>>>2);//无符号右移,1073741822 System.out.println(Integer.toBinaryString(j>>>2));//00111111111111111111111111111110 //左移低位补0 System.out.println(i<<2);//20 System.out.println(Integer.toBinaryString(i<<2));//10100 System.out.println(j<<2);//-20 System.out.println(Integer.toBinaryString(j<<2));//11111111111111111111111111101100
-
按位运算(其中按位非是一元操作符)
-
按位与(&)
-
按位或(|)
-
按位异或(^)
-
按位非(~)
-
实例:
System.out.println(2&3);//2 System.out.println(6|10);//14 System.out.println(5^9);//12 System.out.println(~5);//-6
解析:
- 按位与:第一个数的第n位与第二个数的第n位都是1,则为1,否则为0;它有点像&&操作符(两个为true返回true)
2的8位二进制:0000 0010
3的8位二进制:0000 0011
结果 :0000 0010 - 按位或:第一个数的第n位和第二个数的第n位有一个是1都为1,只有两者都是0才为0
6的8位二进制:0000 0110
9的8位二进制:0000 1010
结果:0000 1110 - 按位异或:第一个数的第n位和第二个数的第n位不同返回1,相同返回0(即一个是1,一个是0返回1;两者都是1或都是0返回0)
5的8位二进制:0000 0101
9的8位二进制:0000 1001
结果:0000 1100 - 按位非:给数的位取反(即1返回0,0返回1)
5的8位二进制为:0000 0101
取反后:1111 1010
在java中最高位为符号位,所以1111 1010是一个负数,而且这是-6在java中的二进制表示
- 按位与:第一个数的第n位与第二个数的第n位都是1,则为1,否则为0;它有点像&&操作符(两个为true返回true)
-