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

时间:2013-10-31 16:44:53

标签: c#

我有一个整数int nine = 9;,二进制为1001。是否有一种简单的方法可以将其反转,以便我可以获得0110

6 个答案:

答案 0 :(得分:32)

int notnine = ~nine;

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

int notnine = ~nine & 0x000000FF;

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

int notnine = ~nine & 0x0000000F;

~ operator是按位否定,而掩码只给你你关心的字节/半字节。

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

int notnine = 15 - nine;

适用于每个蚕食。 : - )

答案 1 :(得分:14)

专门针对它的运营商,~

nine = ~nine;

答案 2 :(得分:4)

这个问题没有完全指定 - 你只关心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

答案 3 :(得分:2)

如果我们将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指令加快速度。

答案 4 :(得分:1)

使用xor和111111 ....

var inverted = a ^ int.MinValue

答案 5 :(得分:0)

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

mask = (1<<n) - 1

2)使用xor

a ^ mask

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

n = 0; while ((1<<n) <= a) n++;