奇怪的按位异或行为

sla*_*ais 0 bit-manipulation

为什么以下"交换"操作会在随机时间失败?

int i,p,a[11] = {0,1,2,3,4,5,6,7,8,9,10 };

srand(time(0));

for (i=0;i<11;i++)
{
    p = rand() % 11;
    a[i] = a[i] ^ a[p];
    a[p] = a[i] ^ a[p];
    a[i] = a[i] ^ a[p];
}
Run Code Online (Sandbox Code Playgroud)

它与这个答案中的逻辑没那么不同
它将适用于3/4运行然后开始复制0

用C和C++试过,结果相同

[编辑]
通过初始化p=0和替换相关的行来解决while (p==i) p = rand() % 11;

更新:不使用原因xor(参见Mark Byers的回答和评论)

Nie*_*sol 6

如果p恰好相同i,那么a[i] ^ a[p]将为零,并且函数的其余部分失败.

从统计上来说,您的代码实际上有65%的可能性以这种方式失败.

确保在生成时p,它与数字不同i.例如:

p = rand() % 10;
if( p >= i) p++;
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 5

i等于p然后a[i] ^ a[p] 变为零.您的"交换"操作被破坏了.

要交换你应该使用一个临时变量:

int temp = a[i];
a[i] = a[p];
a[p] = temp;
Run Code Online (Sandbox Code Playgroud)

不要使用XOR黑客.