正数的原码、反码、补码都是一样的
负数第一位是1,表示负数,反码是在原码的基础上,符号位不动,其余取反;补码是反码+1
1、<< 左移
规则是带符号位移,高位移出,低位补0。左移一位相当于乘以2的一次方,左移n位相当于乘以2的n次方。(往左手边移动)
注:以下数据类型默认为byte---8位
左移时不管正负,低位补0
正数:**r = 20 << 2**
20的二进制补码:0001 0100
向左移动两位后:0101 0000
结果:r = 80(20*2^2)
20的二进制补码:0000 0001 0100
向左移动四位后:0001 0100 0000
结果:r = 320(20*2^4)
负数:**r = -20 << 2**
-20 的二进制原码 :1001 0100
-20 的二进制反码 :1110 1011
-20 的二进制补码 :1110 1100
左移两位后的补码:1011 0000
反码:1010 1111
原码:1101 0000
结果:r = -80
左移四位后的补码:1110 1100 0000
反码:1110 1011 1111
原码:1001 0100 0000
结果:r = -320
2、>>右移
如果该数为正,则高位补0,若为负数,则高位补1;
(往右手边移动)
注:以下数据类型默认为byte-8位
正数:r = 20 >> 2
20的二进制补码:0001 0100
向右移动两位后:0000 0101
结果:r = 5
负数:r = -20 >> 2
-20 的二进制原码 :1001 0100
-20 的二进制反码 :1110 1011
-20 的二进制补码 :1110 1100
右移两位后的补码:1111 1011
反码:1111 1010
原码:1000 0101
结果:r = -5
3、>>> 无符号右移
也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
正数: r = 20 >>> 2
的结果与 r = 20 >> 2 相同;
负数: r = -20 >>> 2
注:以下数据类型默认为int 32位
-20:原码:10000000 00000000 00000000 00010100
反码:11111111 11111111 11111111 11101011
补码:11111111 11111111 11111111 11101100
右移:00111111 11111111 11111111 11111011
结果:r = 1073741819
案例举例
byte[3]={-2,64,101};
字节里面存的是带符号的十进制,需要转换成补码的形式进行各种计算
-2
原码:1000 0010
反码:1111 1101
补码:1111 1110
64
原码:0100 0000
101
原码:0110 0101
每个字节都是8位,合起来就是1111 1110,0100 0000,0110 0101
现在需求是这样:
分别取前12位和后12位算出十进制int值
也就是1111 1110,0100和0000,0110 0101
代码运算应该怎么实现?