一种反转整数变量二进制值的方法

我有这个整数int nine = 9; 二进制是1001 。 有没有一种简单的方法来反转它,所以我可以获得0110

 int notnine = ~nine; 

如果你只担心最后一个字节:

 int notnine = ~nine & 0x000000FF; 

如果你只对最后一个蚕食感兴趣:

 int notnine = ~nine & 0x0000000F; 

〜运算符是按位否定,而掩码只给出你关心的字节/半字节。

如果你真的只对最后一个半字节感兴趣, 简单的是:

 int notnine = 15 - nine; 

适用于每个蚕食。 🙂

有专门为它操作的操作员, ~

 nine = ~nine; 

这个问题没有完全指定 – 你只关心4位,还是答案应该调整到输入中的有效位数? 如果它是后者那么你需要一些复杂的位操作来掩盖高位。

我会稍微修改一下Bit Twiddling Hack来创建蒙版。

 int mask = num; mask |= mask >> 1; mask |= mask >> 2; mask |= mask >> 4; mask |= mask >> 8; mask |= mask >> 16; int inverse = ~num & mask; 

请参阅以下内容: http : //ideone.com/pEqwwM

如果我们将9视为这样的整数:

 00000000000000000000000000001001 

你想拥有:

 00000000000000000000000000000110 

代替:

 11111111111111111111111111110110 

并且比最后的半字节更关心(例如也想要处理128903)。

然后你可以创建一个蒙版并应用它:

 uint value = 9; //or try 1290320 uint mask = 0; for (int i = 1; i <= 16; i *= 2) mask |= mask >> i; value = mask & (~value); 

您可以使用http://en.wikipedia.org/wiki/Find_first_set的修改版本或使用bsf asm指令加快速度。

使用xor和111111 ….

 var inverted = a ^ int.MinValue 

1)为要翻转的最后n位创建一个掩码

 mask = (1< 

2)使用xor

 a ^ mask 

另外,如果你想从二进制表示的第一个1开始翻转位,你可以这样做

 n = 0; while ((1<