我有一个int,我想使用〜位运算符反转它的位。这应该是一个非常简单的事情,但是我尝试过它并不起作用。我想这是因为java使用两个补码来表示它的int。那么最有效的方法是什么?反转50时应该是13,这是我想要的值
答案 0 :(得分:2)
似乎你只需要按位补码的一部分,直到输入的最有意义的设置位。然后你只需掩盖补充,
int invert(int n) {
return ~n & mask(n);
}
int mask(int n) {
n |= n >> 1;
n |= n >> 2;
n |= n >> 4;
n |= n >> 8;
return n | (n >> 16);
}
答案 1 :(得分:0)
Java int
为32位长,1位用于符号。因此,50以二进制表示为00000000000000000000000000110010
。如果你对它进行位反转,你将获得11111111111111111111111111001101
,这是十进制表示法中的java整数值-51。
答案 2 :(得分:-2)
由于int
应该至少为32位宽,~50绝对不是13.我认为你假设int
只有8位宽,这可能就是这种情况237年前,但绝对不是现在,而不是Java,无论如何。如果您需要保证8位宽的数据类型,请使用byte
。
但即使这样,~50也不是13,只有将最低6位考虑在内。但所有这些都与二人的补充无关。