Java中的二进制相关运算

2022-07-31  本文已影响0人  沉淀者

正数的原码、反码、补码都是一样的
负数第一位是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

代码运算应该怎么实现?


5df3b5e7ae20264461ab18f4c98cca5.jpg
上一篇下一篇

猜你喜欢

热点阅读