【问题标题】:Using XOR in C with declaration bool在 C 中使用带有声明 bool 的 XOR
【发布时间】:2020-06-12 19:03:51
【问题描述】:

我对 XOR 有疑问。有一些例子。我有这个: bool a[4]=[1,0,0,1] 和 bool b[4]=[0,1,0,1]。我想创建 XOR 并写入 boll xor[4]。我试试这个,但它不起作用。你能帮我解决这个问题吗?

bool xor[4];
   for(int i=0;i<4;i++){
     if((a[i]==0) && (b[i]==0)){
       xor[i]=0;
     }
     else if((a[i]==1) && (b[i]==1)){
       xor[i]=0;
     }
     else if((a[i]==1) && (b[i]==0)){
       xor[i]=1;
     }
     else if((a[i]==0) && (b[i]==1)){
       xor[i]=1;
     }
   }

【问题讨论】:

  • bool a[4]="1001" 没有意义。你用字符串初始化bool 数组。每个元素都是true
  • 拜托,你正在用另一个错误的东西改变。请提供minimal reproducible example
  • 您的代码有效:ideone.com/qOxFN2
  • 如果if .... else if ... 链中没有一条不正确怎么办?没有看到所有的 true 代码,很多都不清楚。 “它不起作用”是不够的。发布minimal reproducible example。使用的输入,看到的输出,预期的输出。
  • 顺便说一句,你知道^ xor 运算符吗?

标签: c boolean xor


【解决方案1】:

也许更简单一些。

int xor(int a, int b)
{
    return (!!a) ^ (!!b);
}

我使用二进制 XOR。但是为了确保传递的值是 0 或 1,我在逻辑上对参数进行双重否定。

或者像Eugene Sh.提到的那样

bool xor(int a, int b)
{
    return (!!a) != (!!b);
}

// OR if you want to use xor binary operator

bool xor(int a, int b)
{
    return !!((!!a) ^ (!!b))
}

https://godbolt.org/z/NoCPbu

【讨论】:

  • “A 和 B 之一为真”与“非 A 和非 B 之一为真”是一回事;可以简化。
  • 例如 我相信!!((!!a) ^ (!!b)) == (!!a) ^ (!!b) == !a ^ !b.
  • @Neil 不,不是。严格要求它们不同的类型,这就是这些操作的重点
  • 否定是对{0,1} 的投影,因为它的范围是幂等的;见this answer。异或是commutative and it's own inverse。如果a,b \notin [0,1]a ^ b 会给出不同的答案,但我认为我的简化是一般性的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 2010-10-01
  • 2019-08-04
  • 2013-05-19
  • 1970-01-01
  • 2016-03-13
相关资源
最近更新 更多