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

What is n= n ^1U<<i?

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

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

i 正在计数。
1U << i 是单个无符号位 (LSB),每轮向左移动 i,即它扫描位位置 0001、0010、0100、1000(请以二进制形式读取) .
n = n ^ 1U << in 设置为 n 和移位位的 XOR。 IE。它完全异或 n 位。
结果是完全反转的 n.

让我们看一下示例 13 的 4 次迭代,二进制 1101。

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

0010 is 1101 ^ 1111

正如 Eric Postpischil 提到的:

The parameter n to the function is a long, but the code iterates i through only 32 bits. It flips the low 32 bits in n, leaving high bits, if any, unaltered.
If long is 32 bits, then n = n ^ 1U << i is implementation-defined in some cases since the ^ of a long with an unsigned int will result in an unsigned long, and, if the resulting value cannot be represented in a long, the result is implementation-defined.

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

它将翻转n中的低32位。总体效果与 n ^= 0xFFFF.

相同

在您的代码中,nlong。如果您使用的是 32 位编译器,那么它将有 32 位,但在其他编译器上可能更长。

如果你展开循环,你会得到这样的东西:

n = n ^ 1U << 0;
n = n ^ 1U << 1;
n = n ^ 1U << 2;
...

由于 << 的优先级高于 ^,因此将解析为:

n = n ^ 1;
n = n ^ 2;
n = n ^ 4;
...

最终效果是翻转 n 的 32 位,一次一位。