二进制补码:
0000:0
1111:-1
0111:7
1000:-8
0110:6
1001:-7
-1:0000--》1111
-n=~n+1
补码面试题:
System.out.println(Integer.MIN_VALUE-Integer.MAX_VALUE); //1000 - 0111--->1000+1001=1
System.out.println(Integer.MIN_VALUE-1); //1000 + 1111--->0111=最大值 A
选择如上代码的运行结果:
A. 2147483647 B.-2147483648 C.4294967296 D.1 E.-1
~ 取反
System.out.println(~88);
选择如上代码的运行结果:
A. 88 B.-88 C.89 D.-89 E.98
>>> >> << 移位运算
01100100 2^6+2^5+2^2=64+32+4=100
m = n<<1; //011001000 2^7+2^6+2^3=128+64+8=200
k = n<<2; //0110010000 2^8+2^7+2^4=256+128+16=384+16=400
相当于位移1位,乘2
>>> 向右移动, 高位永远补0, 负数时候不符合数学除法规律。
>> 数位向右移动, 高位为1(负数) 则补1, 高位为0(正数) 则补0, 保持符号位不变, 其结果符合数学除法规律(自动向小方向取整)
& | 与 或 运算
经典用途: 截取一个数据的后8位, 称为"掩码(mask)"运算
n = 01100011 00100110 00110111 11011110
m = 00000000 00000000 00000000 11111111 mask
k = n&m;
k = 00000000 00000000 00000000 11011110
123是十进制,但0123则表示采用八进制, 0x1表示一个16进制数