【问题标题】:How to reverse a bit shifting method如何反转位移方法
【发布时间】:2015-02-11 08:09:40
【问题描述】:

我有这个方法:

公共静态无效转储参数(字节b){ System.out.println("参数:" + Integer.toHexString(b)); System.out.println("参数 1:" + ((b & 0x01) >> 0)); System.out.println("参数 2:" + ((b & 0x02) >> 1)); System.out.println("参数 3:" + ((b & 0x0c) >> 2)); System.out.println("参数 4:" + ((b & 0xf0) >> 4)); }

我试图用这种方法来扭转它:

公共静态字节 setParameters(int b1,int b2,int b3,int b4){ 字节结果=(字节)b1; 结果 |= (b2 | 0x02)

像这样调用这些方法:

转储参数((字节)0xb2); 字节结果 = setParameters(0, 1, 0, 11); 转储参数(结果);

结果:

参数:ffffffb2 参数 1:0 参数 2:1 参数 3:0 参数 4:11 参数:ffffffb6 参数 1:0 参数 2:1 参数 3:1 参数 4:11

我感兴趣的结果以 ffffffb6 的值结束;我期待 ffffffb2

setParameters 方法不起作用,为什么?

【问题讨论】:

  • 我不认为你想or 反对一个常数。尝试使用result |= b2 << 1; 等。
  • 删除 0x0c 实例如何工作?转储方法对我的应用程序有效,这一点我很确定。
  • 因为在这种情况下result |= (b3 | 0x0c) 按位或result 反对52。据我所知,您只是想在位置 5 和 6 设置 2 位。

标签: java bit-shift


【解决方案1】:

按位或将完全破坏参数,只需将它们移位,然后取所需的位:

public static byte setParameters(int b1, int b2, int b3, int b4) {
    byte result = (byte) b1;
    result |= (b2 << 1) & 0x02;
    result |= (b3 << 2) & 0x0c;
    result |= (b4 << 4) & 0xf0;
    return result;
}

【讨论】:

    【解决方案2】:

    这是我认为你想要得到的代码:

    public static byte setParameters(int b1, int b2, int b3, int b4) {
        byte result = (byte) b1;
        result |= (b2 & 0x01) << 1;
        result |= (b3 & 0x03) << 2;
        result |= (b4 & 0x0f) << 4;
        return result;
    }
    

    【讨论】:

    • 您的方法同样有效,但@cy3er 提交了一个“看起来”更接近原始转发(转储)方法的方法。
    猜你喜欢
    • 2020-10-06
    • 2015-04-12
    • 2011-11-22
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多