首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇异位异或行为

奇异位异或行为
EN

Stack Overflow用户
提问于 2012-07-03 19:24:14
回答 5查看 203关注 0票数 0

为什么下面的“交换”操作会在随机时间失败?

代码语言:javascript
复制
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];
}

它与这个答案中的逻辑并没有太大的不同。

它将运行3/4,然后开始复制0。

在C和C++中试用,结果是一样的

编辑

通过初始化p=0并用while (p==i) p = rand() % 11;替换相关行来解决

更新: 不使用的理由 xor (见马克·拜尔斯的回答和注释)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-03 19:26:58

如果p碰巧与i相同,那么a[i] ^ a[p]将为零,而函数的其余部分将失败。

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

确保在生成p时,它不是与i相同的数字。例如:

代码语言:javascript
复制
p = rand() % 10;
if( p >= i) p++;
票数 6
EN

Stack Overflow用户

发布于 2012-07-03 19:26:48

i等于p时,a[i] ^ a[p]变为零。你的“交换”操作失败了。

要进行交换,您应该使用一个临时变量:

代码语言:javascript
复制
int temp = a[i];
a[i] = a[p];
a[p] = temp;

不要使用异或黑客。

票数 5
EN

Stack Overflow用户

发布于 2012-07-03 19:27:00

因为p随机等于i。在这种情况下,a[i]立即变为0。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11317767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档