为什么C语言中bitwise biconditional的积之和实现无法正常工作
两段C代码无法实现位等值判断(bitwise biconditional)的原因
我们首先明确要实现的功能:位等值判断要求两个整数a、b的每一位都完全相同时返回1,存在任意一位不同时返回0,等价于用位运算实现a == b的布尔判断。
第一段代码问题分析
代码:int x = !!((a & b) | (~a & ~b))
(a & b)会得到所有a、b同时为1的位组成的整数,(~a & ~b)会得到所有a、b同时为0的位组成的整数,两者做或运算后,只要存在任意一位a和b取值相同,结果就不为0。- 外层的
!!仅会把非0值转为1、0值保持为0,因此这段代码的实际逻辑是:只要a和b存在至少一位相同就返回1,只有当a和b每一位都完全相反时才返回0,和需求完全不符。 - 反例:a=1(十六进制
0x00000001),b=2(十六进制0x00000002),两个数明显不等,但高位全部为0(取值相同),因此~a & ~b的高位全为1,整体运算结果非0,!!后返回1,结果错误。
第二段代码问题分析
代码:int x = !!(!!(a & b) | !!(~a & ~b))
- 内层的两个
!!直接把a&b和~a&~b转为了布尔值:只要存在任意一位a、b同时为1,!!(a&b)就为1;只要存在任意一位a、b同时为0,!!(~a&~b)就为1。 - 两者做或运算后再转布尔值,结果几乎永远为1,只有当a和b没有任何一位取值相同(所有位都相反)时才返回0,错误比第一段更极端,完全不符合功能要求。
- 反例:还是a=1、b=2的场景,存在大量同时为0的高位,因此
!!(~a&~b)为1,整体结果返回1,和预期的0不符。
第三段代码正确的原因
代码:!((a & ~b) | (~a & b))
(a & ~b)会提取所有a为1、b为0的位,也就是a和b取值不同的位。(~a & b)会提取所有a为0、b为1的位,同样是a和b取值不同的位。- 两者做或运算的结果,就是所有a和b取值不同的位组成的整数:如果结果为0,说明没有任何一位不同,a和b完全相等;如果结果非0,说明存在不同的位,a和b不等。
- 外层的
!会把结果转为对应的布尔值:结果为0时返回1(相等),结果非0时返回0(不等),完全符合位等值判断的要求。
内容的提问来源于stack exchange,提问作者md657
相关产品推荐
相关产品推荐

