美文网首页
Java中的二进制相关运算

Java中的二进制相关运算

作者: 沉淀者 | 来源:发表于2022-07-31 21:05 被阅读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

    相关文章

      网友评论

          本文标题:Java中的二进制相关运算

          本文链接:https://www.haomeiwen.com/subject/uwarwrtx.html