java中使用int的位操作

java中使用int的位操作,java,bit-manipulation,Java,Bit Manipulation,我有一个int,我想用~bit运算符反转它的位。这应该是一个非常简单的事情,但我尝试了,它不工作。我想这是因为java使用2的补码来表示它的int。那么最有效的方法是什么呢?50当倒过来时应该是13,这是我想要的值似乎您只想要按位补码的一部分,直到输入的最重要的设置位。那么你只需要掩盖补码 int invert(int n) { return ~n & mask(n); } int mask(int n) { n |= n >> 1; n |= n &

我有一个int,我想用~bit运算符反转它的位。这应该是一个非常简单的事情,但我尝试了,它不工作。我想这是因为java使用2的补码来表示它的int。那么最有效的方法是什么呢?50当倒过来时应该是13,这是我想要的值

似乎您只想要按位补码的一部分,直到输入的最重要的设置位。那么你只需要掩盖补码

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);
}

因为
int
应该至少有32位宽,~50肯定不是13。我想你是在假设
int
只有8位宽,这可能是237年前的情况,但肯定不是现在,也不是在Java中。如果需要保证8位宽的数据类型,请使用
byte


但即使如此,~50也不是13,只要将最低有效位6考虑在内。但所有这些都与2的补码无关。

Java
int
是32位长,1位用作符号。因此,50在二进制中表示为
000000000000000000000110010
。如果对其进行位反转,您将得到
11111111111111111111 001101
,这是java整数值-十进制表示法中的51。

50只有在处理6位时才在反转时变为13。与
char
不同的是8位。你确定你的目标是对的吗?100转化为27。为了单词,我需要将这个int转换成一个字节数组,我想,并将其反转。请解释为什么你认为50应该变成13。。。你只是想把这些位反转到原始int中的最高设置位吗?@xonegirlz:我不知道字节数组是从哪里来的,也不知道如何从100到27,除非(正如我所说)你只想反转原始设置的位数。请注意,这将不是一个可逆操作-想想你希望27的倒数是什么…@JonSkeet是的,只是想反转原来已经设置的位,对不起,我应该说清楚一点。如果n设置了第k位,但没有更高的,掩码(n)设置了第0到k位,你介意给我解释一下上面的方法吗,(k+1)通过
n |=n>>1;
为每个设定位设置下一个较低的位,因此,例如
0x40
变为
0x60
,然后对于两个设定位的每组,下一个较低的组由
n |=n>>2;
设置,例如给出
0x78
。继续加倍设定位的组长度,直到g最高集合位的组保证包含第0位。然后在反转中,我们取全位补码并屏蔽我们不感兴趣的内容。