代码之家  ›  专栏  ›  技术社区  ›  zaozaoer

>>java中带负字节值的and>>>运算符

  •  1
  • zaozaoer  · 技术社区  · 6 年前

    我有这样一个示例代码段:

        byte a = -0b00001111;
        byte b = a;
        byte c = a;
    
        System.out.println("a=" + a );
        System.out.println("b=" + (b >> 1) );
        System.out.println("c=" + (c >>> 1) );
    

    并且,它打印:

    a=-15

    b=-8

    c=2147483640

    我不太明白b和c是如何分别成为这两个值的,有人能给我演示一下这两个值是如何计算的吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   rgettman    6 年前

    对于字节 a ,您有文字 0b00001111 ,对于 15 所以 A. -15 .的位表示 -15个 对于 byte 是:

    11110001
    

    在Java中, unary numeric promotion occurs 关于位移位运算符的操作数 << ,则, >> >>>

    对每个操作数分别执行一元数字提升(§5.6.1)。

    这意味着该值提升为 int 换档前。

    代码 (b >> 1) 提升 b 内景 ,然后使用符号扩展来移动值。这意味着,如果该值已经为负值,则 1 位被移位以确保其仍然为负值。

    11110001
    

    被提升为

    11111111 11111111 11111111 11110001
    

    这是 -15个 作为 内景 .右移一位后,带符号扩展:

    11111111 11111111 11111111 11111000
    

    这是 -8

    然而,对于代码 (c >>> 1) 这个 >>> 无符号右移运算符执行 执行符号扩展,即使升级到 内景 维护符号和值。

    11110001
    

    被提升为

    11111111111111111111111111111111110001
    

    这是 -15个 作为 内景 和以前一样。无符号右移一位后:

    01111111 11111111 11111111 11111000
    

    第一位是现在 0 。如果未设置最高有效位,则值现在为2 31 -8或2147483640。