对于有符号的而言:
- 二进制的最高位时符号位:0表示正数,1表示负数(0 ->0, 1-> -);
- 正数的原码,反码,补码都一样(三码合一);
- 负数的反码=他的原码符号位不变,其它位取反(0->1, 1-0);
- 负数的补码=它的反码+1,负数的反码=负数的补码-1;
- 0的反码,补码都是0;
- java没有无符号数,换言之,java中的数都是有符号的;
- 在计算机运算的时候,都是以补码的方式来运算的;
- 当我们看运算结果的时候,要看它的原码;
位运算符:
java中有7个位运算(&、|、^、~、>>、<<、>>>)
运算规则:
- 按位与&:两位全为1,结果位1,否则位0;
- 按位或|:两位有一位为1,结果为1,否则为0;
- 按位异或^:两位一个为0,一个为1,结果为1,否则为0;
- 按位取反~:0 -> 1,1 -> 0;
举例:
// 推导过程:、
// 1. 2的补码 => 2的原码(int 类型四个字节) => 00000000 00000000 00000000 00000010
// 2的补码(三码合一) => 00000000 00000000 00000000 00000010
// 2. 3的补码 => 3的原码(int 类型四个字节)=> 00000000 00000000 00000000 00000011
// 3的补码(三码合一) => 00000000 00000000 00000000 00000011
/*
00000000 00000000 00000000 00000010
&
00000000 00000000 00000000 00000011
---------------------------------------
00000000 00000000 00000000 00000010 => 2
*/
System.out.println(2&3);//2
/*
推导过程:
1. 先得到-2的原码 => 00000000 00000000 00000000 00000010
2. -2的反码(三码合一) => 11111111 11111111 11111111 11111101
3. -2 的补码 => 11111111 11111111 11111111 11111110
4. ~-2操作: => 00000000 00000000 00000000 00000001
5.运算后的原码 => 00000000 00000000 00000000 00000001 => 1
*/
System.out.println(~-2);//1
/*
推导过程:
1. 先得到2的原码 => 00000000 00000000 00000000 00000010
2. 2的补码(三码合一) => 00000000 00000000 00000000 00000010
3. 得到3的原码 => 00000000 00000000 00000000 00000011
4. 3的补码(三码合一) => 00000000 00000000 00000000 00000011
5.
00000000 00000000 00000000 00000010
|
00000000 00000000 00000000 00000011
---------------------------------------
00000000 00000000 00000000 00000011 => 3
*/
System.out.println(2|3);//3