我有这个整数int nine = 9;
,二进制是1001
. 有没有一种简单的方法来反转它,所以我可以得到0110
?
问问题
35586 次
6 回答
44
int notnine = ~nine;
如果您只担心最后一个字节:
int notnine = ~nine & 0x000000FF;
如果你只对最后一个半字节感兴趣:
int notnine = ~nine & 0x0000000F;
~ 运算符是按位否定,而掩码只为您提供您关心的字节/半字节。
如果你真的只对最后一个半字节感兴趣,最简单的是:
int notnine = 15 - nine;
适用于每一口。:-)
于 2013-10-31T16:48:02.053 回答
17
有专门针对它的运算符,~
.
nine = ~nine;
于 2013-10-31T16:47:50.500 回答
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
于 2013-10-31T18:11:58.187 回答
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 指令来加快速度。
于 2013-10-31T17:23:35.720 回答
1
对 111111 使用 xor ....
var inverted = a ^ int.MinValue
于 2013-10-31T16:47:44.290 回答
0
1) 为要翻转的最后 n 位创建掩码
mask = (1<<n) - 1
2) 使用异或
a ^ mask
此外,如果您想从二进制表示中的第一个 1 开始翻转位,您可以这样做
n = 0; while ((1<<n) <= a) n++;
于 2013-11-01T11:00:11.173 回答