首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按位运算符

按位运算符
EN

Stack Overflow用户
提问于 2014-12-13 10:30:54
回答 2查看 367关注 0票数 1

公共类UnsignedShift {

代码语言:javascript
运行
复制
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

EN

回答 2

Stack Overflow用户

发布于 2014-12-13 11:23:18

java中没有可以直接操作字节(8位)的二进制运算符。byte、short或char类型的变量在按照here中的详细说明执行此类操作之前,会自动经历“数值提升”到32位整数。下面是你的代码中发生的事情:

代码语言:javascript
运行
复制
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位变量就更容易了,如下面的例子所示:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2014-12-13 11:32:00

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

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

d>>4将为11111111

0x0f将为00001111

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

D将是11111111

0f将是00001111

十六进制和0x0f将是00001111 == 15

所以最终答案是: 0xff

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27454923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档