Java位智能运算符(零填充移位)不填充零

时间:2016-12-01 01:21:50

标签: java bit-manipulation

我遇到了一个奇怪的Java问题,并且已经在Windows和Mac系统上进行了测试,并且始终存在这个问题。

看看这段代码

public static void playA() {
    MyObject object = check("cat");
    // some stuff...
}

private static MyObject check(String s) throws SQLException {
    // some stuff checking string
    MyObject o = methodA(s);
    // some stuff doing on the object
    return o;
}

private static MyObject methodA(String s) throws SQLException {
    Connection c = MySettings.getConnection();
    PreparedStatement ps = c.prepareStatement("select * from Objects where type = ?");
    ps.setString(1, s);
    ResultSet resultSet = ps.executeQuery();
    while (resultSet.next()) {
        // mapping
        return object;
    }
    return null;
}

我希望这段代码生成56,其二进制形式为00111000。但是,它以二进制形式生成值1073741816,1111111111111111111111111111000。我知道java中的int是32位,但是设置byte的类型也是一样的。

但是,如果我声明像这样的二进制文字

int a = -32; //11100000 as per two's complement
System.out.println(a >>> 2);

第一个语句产生值224(预期为-32),而第二个语句产生预期值56

我疯了吗?

1 个答案:

答案 0 :(得分:1)

drawBar()中的位模式不像你说的那样b,但是11100000

你正在使用一个32位的11111111 11111111 11111111 11100000 - 而不是一个字节 - 并且使用二进制文字并没有改变它。

即使您使用int而不是byte,它也无法解决您的问题,因为Java bitshift运算符首先将任何小于32位的类型提升为32位。

因此,移位后得到的位模式为int

如果要模拟使用8位值,则需要在应用bitshift之前将32位值位掩码为低8位(您可以使用00111111 11111111 11111111 11111000而不是{ {1}}现在)

>>