如何在 C 语言中进行按位 XNOR

jes*_*ess -1 c bit-manipulation xor bitwise-xor

XNOR我在编写最多包含 7 个~和运算符的按位函数时遇到困难|。例子:bitXnor(6, -5) = 2。如果没有 ,我该如何做到这一点&

到目前为止我有这个:

int bitXnor(int x, int y) {
  return ~(~x | ~y);
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

int bitXnor(int x, int y) {
  return ~(~x | ~y);
Run Code Online (Sandbox Code Playgroud)

438*_*427 5

现在是学习德摩根定律的好时机,即

~ (x & y) == (~x | ~y)
Run Code Online (Sandbox Code Playgroud)

XNOR 是

(~a & ~b) | (a & b)
Run Code Online (Sandbox Code Playgroud)

通过添加双反转(又名双非)来重写以获得

~~(~a & ~b) | ~~(a & b)
Run Code Online (Sandbox Code Playgroud)

然后使用 De Morgan 重写

~(~~a | ~~b) | ~(~a | ~b)
Run Code Online (Sandbox Code Playgroud)

并减少第一部分(即删除双反转)

~(a | b) | ~(~a | ~b)
Run Code Online (Sandbox Code Playgroud)

这是使用 7 的 XNOR~|

资料来源: https: //en.wikipedia.org/wiki/De_Morgan%27s_laws

顺便提一句:

使用相同的原理德摩根定律可以导致

(~a & ~b) | (a & b)
Run Code Online (Sandbox Code Playgroud)

~~((~a & ~b) | (a & b))
Run Code Online (Sandbox Code Playgroud)

~(~(~a & ~b) & ~(a & b))
Run Code Online (Sandbox Code Playgroud)

~对于仅使用和构造的 XNOR &。在这种情况下需要 8 个操作员。

编辑:

~正如用户“chux-Reinstate Monica”所指出的,仅使用and&7 个运算符即可完成此操作。

例如,通过添加一些额外的步骤,例如:

(~a & ~b) | (a & b)
Run Code Online (Sandbox Code Playgroud)

~~((~a & ~b) | (a & b))
Run Code Online (Sandbox Code Playgroud)

~(~(~a & ~b) & ~(a & b))
Run Code Online (Sandbox Code Playgroud)

~((a | b) & (~a | ~b))
Run Code Online (Sandbox Code Playgroud)

~(((a & (~a | ~b)) | (b & (~a | ~b)))
Run Code Online (Sandbox Code Playgroud)

~((a & ~a) | (a & ~b) | (b & ~a) | (b & ~b))
Run Code Online (Sandbox Code Playgroud)

~((a & ~b) | (b & ~a))
Run Code Online (Sandbox Code Playgroud)

~(a & ~b) & ~(b & ~a)
Run Code Online (Sandbox Code Playgroud)

现在已减少至 7 名操作员。