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

为什么按位和给出不同的字节?

  •  2
  • Grim  · 技术社区  · 6 年前

    Java中的字节是8位长。A & 运算符按位执行 and 操作。

    十六进制表示需要两个十六进制字符 0-F .

    A 0xFF 是一个字节。

    如果我想到 & 操作我认为处理器会这样做:

       Bit no: 1 2 3 4 5 6 7 8 
       Binary: 0 0 0 0 0 0 1 0 = decimal 2
    Operation: & & & & & & & &
        Value: 1 1 1 1 1 1 1 1 = 0xFF
    ----------------------------------------
       Result: 0 0 0 0 0 0 1 0 = decimal 2
    

    因为所有的二进制文件都保持不变,所以我认为我们不需要 & 0xFF .

    代码

    public static void main(String[] args) {
        byte b = -1;
        System.out.println(String.valueOf(b).concat(" and ").concat(String.valueOf(b & 0xFF)));
    }
    

    结果

    -1 and 255
    

    如果我的假设(我们不需要 &0×FF )是正确的,为什么不同?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Nick Silvestri    6 年前

    0xFF 等于int,其值为 255 00000000 00000000 00000000 11111111 11111111 ,因为它是签名的,所以这被解释为 -1 .

    当你 & int 00000000 00000000 00000000 11111111 .

        2
  •  2
  •   k_ssb    6 年前

    0xFF int ,不是 byte b & 0xFF 利息 算术(Java不允许)-所有数据类型小于 利息 一定有 1 咬入

    System.out.println(0xFF);            // 255. (only 8 of 32 bits are 1)
    System.out.println((int)0xFF);       // 255. (only 8 of 32 bits are 1)
    System.out.println((byte)0xFF);      // -1. (all 8 of 8 bits are 1)
    System.out.println((int)(byte)0xFF); // -1. (all 32 of 32 bits are 1)
    

    注意,通过铸造 利息 .因此,下面的代码执行您想要的操作(注意,有一个隐式强制转换 字节

    public static void main(String[] args) {
        byte b = -1;
        System.out.println(String.valueOf(b) + " and " + String.valueOf(b & (byte)0xFF)));
    }
    

    -1和-1