什么是 n= n ^1U<<i?

aks*_*roy 10 c c++ iteration loops bit-manipulation

我在这里面临的问题是了解n循环每次迭代中的值的变化。
如果你通过 2-3 次迭代来解释它,那将会很棒。更正 - 返回值应该是 32 位 ....这是改变所有位 0->1 ans 1->0 。

long fun(long n)
{
    for(int i = 0; i < 32; i++)
        n = n ^ 1U << i;
    return n;
}   
Run Code Online (Sandbox Code Playgroud)

Yun*_*sch 12

i正在计数。
1U << i是单个无符号位 (LSB),它在每一轮i中向左移动,即它扫描位位置 0001、0010、0100、1000(请读为二进制)。
n = n ^ 1U << i设置nn和移位的位的异或。即它n一点一点地完全异或。
结果是完全颠倒了n

让我们以二进制形式查看示例 13, 1101 上的 4 次迭代。

1101 ^ 0001 is 1100
1100 ^ 0010 is 1110
1110 ^ 0100 is 1010
1010 ^ 1000 is 0010

0010 is 1101 ^ 1111
Run Code Online (Sandbox Code Playgroud)

正如 Eric Postpischil 所说:

n函数的参数是 a long,但代码i仅迭代了 32 位。它翻转 中的低 32 位n,保留高位(如果有)不变。
如果long是 32 位,则n = n ^ 1U << i在某些情况下是实现定义的,因为^along和 an 的unsigned int结果是 an unsigned long,如果结果值不能用 a 表示long,则结果是实现定义的。

如果我们假设 的合适输入n,例如可以用 32 位宽类型表示,或者仅翻转低位是有意的,那么这不是问题。
请注意这一点和 Eric 的评论,along是隐式带符号的,这意味着准 MSB 不能完全用于值表示(无论是 2-补码还是 1-补码或符号表示),因为范围的一半用于负数值。然后通过 XOR 切换它会产生潜在的奇怪效果。