繁体   English   中英

按位运算符

[英]Bitwise Operator

公共类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

Java中没有二进制运算符可以直接使用字节(8位)进行运算。 在执行类似此处所述的操作之前,类型为byte,short或char的变量会自动进行“数字提升”为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;    // 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)轻松地以十六进制格式打印整数。

字节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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM