按位运算符

时间:2014-12-13 02:30:54

标签: java binary bit-manipulation shift

公共类UnsignedShift {

public static void main(String[] args) {

    char hex[] = new char[] {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};


    byte b = (byte) 0xf1;
    byte d = (byte)(b>>>4); 


    System.out.println("b>>>4=0x" + hex[(d>>4)&0x0f] + hex[d&0x0f]);

    }

}

结果= 0xff

任何人都可以解释在Java中它是如何实现的吗?

我认为,它是0x0f

2 个答案:

答案 0 :(得分:1)

java中没有可以直接使用字节(8位)操作的二元运算符。类型为byte,short或char的变量会自动进行“数字提升”到32位整数,然后按照here中的详细说明执行这些操作。 所以这是你的代码中发生的事情:

public static void main(String[] args) {

    char hex[] = new char[] {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

    byte b = (byte) 0xf1;    // b is a byte with 0xf1
    byte d = (byte)(b>>>4);  // b is converted to int, becoming 0xfffffff1 then shifted
                             // to the right by 4 bits, resulting in 0x0fffffff

    System.out.println("b>>>4=0x" + hex[(d>>4)&0x0f] + hex[d&0x0f]);

}

如果你想要做到这一点,就可以更容易地为所有二进制操作使用32位变量,如下例所示:

public static void main(String[] args) {
       char hex[] = new char[] {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};

        byte b = (byte) 0xf1;
        int ib = b & 0xff;
        byte d = (byte)(ib>>>4); 

        System.out.println("b>>>4=0x" + hex[(d>>4)&0x0f] + hex[d&0x0f]);
}

注意:如果您不知道,可以通过调用Integer.toHexString(n)轻松打印十六进制格式的整数。

答案 1 :(得分:0)

  

字节b =(字节)0xf1将是1111 0001

     

字节d =(字节)(b>>> 4)将是1111 1111

     

d>> 4将是11111111

     

0x0f将为00001111

     

(d>> 4)& 0x0f将为00001111 == 15

     

d将是11111111

     

0f将是00001111

     

hex [d& 0x0f]将为00001111 == 15

     

所以最终答案:0xff

我认为您期望(字节)(b>>>> 4)将0从左向右移动4次。但是b是一个32位的整数,它将从左移动4个字节但被(byte)转换忽略。字节转换取整数的8个最低有效位。