如何在C语言中用~和|实现符合要求的bitwise XNOR函数?
位运算XNOR函数实现问题解决
问题背景
需要实现一个按位XNOR函数,限制最多使用7个~和|运算符,不能使用&运算符。示例:bitXnor(6, -5)应返回2。
现有代码:
int bitXnor(int x, int y) { return ~(~x | ~y); }
测试失败案例:
ERROR: Test bitXnor(-2147483648[0x80000000],-2147483648[0x80000000]) failed...
...Gives -2147483648[0x80000000]. Should be -1[0xffffffff]
问题原因
现有代码~(~x | ~y)本质是按位与(x & y),并非XNOR。在32位有符号整数中,当输入为0x80000000(最小负整数)时:
~x结果为0x7fffffff(最大正整数)~x | ~y结果为0x7fffffff- 再次取反得到
0x80000000,与预期的全1(-1)不符。
解决方案
利用按位异或(XOR)的等价转换:x ^ y = ~(x | ~y) | ~(~x | y),而XNOR是XOR的取反,因此可以得到符合要求的实现:
int bitXnor(int x, int y) { return ~( ~(x | ~y) | ~(~x | y) ); }
运算符计数验证
~运算符:4次|运算符:3次
总计7个运算符,满足限制条件。
测试验证
- 输入
0x80000000和0x80000000:x | ~y=0x80000000 | 0x7fffffff=0xffffffff,取反后为0~x | y=0x7fffffff | 0x80000000=0xffffffff,取反后为0- 两者按位或为
0,取反后得到0xffffffff(即-1),符合预期。
- 输入
6和-5:最终返回2,与示例一致。
内容的提问来源于stack exchange,提问作者jess
相关产品推荐
相关产品推荐

