为什么java按位恭维不能正确切换?

时间:2016-03-17 08:37:33

标签: java bit-manipulation

我有以下代码:

int b1 = 0b1011;
b1 = ~b1;
System.out.println(Integer.toBinaryString(b1));

但我没有得到预期的结果即。 100

我得到的是11111111111111111111111111110100

任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:4)

您正在翻转一个由四个字节组成的整数,即32位。前28位最初为0.它们也会被翻转,这会导致您得到的数字。 在翻转之前:

b1 = 0b00000000000000000000000000001011

翻转后:

b1 = 11111111111111111111111111110100

为了摆脱不需要的1,你可以在翻转位之后逻辑地和b1

b1 = ~b1
b1 = b1 & 0b1111

答案 1 :(得分:1)

你没事 0b1011 00000000000000000000000000001011相同 反过来就是:

11111111111111111111111111110100

这样做是为了保持位长:

int b1 = 0b1011;
b1 = ~b1;
b1 = b1 & 0b1111;
final String x = String.format("%4s", Integer.toBinaryString(b1)).replace(' ', '0');
System.out.println(x);