如何确定三个数字是否相等

4

如果仅使用位运算,如何确定三个数字是否相等。到目前为止,我有下面的代码,但它不能处理边缘情况,例如0x80000000、0x7fffffff和0x7fffffff。

int isEqualThree(int x, int y, int z) {
    int first = x ^ y;
    int second = first ^ z;
    int third = second ^ x;
    int final = !third;
    return final;
}
4个回答

5

试一下这个

int check(int a,int b,int c)
{
    return !((a^b)|(b^c));
}

既然没有规定使用运算符的数量限制,如果不允许使用叹号,那么在考虑32位数字的情况下,只使用按位运算符也可以成为解决方案。

int check(int a,int b,int c)
{
  int d;
  d=(a^b)|(b^c); 
  d=~d; 
  return ((d>>31&1)&(d>>30&1)&(d>>29&1)&(d>>28&1)&(d>>27&1)&(d>>26&1)&(d>>25&1)&(d>>24&1)&(d>>23&1)&(d>>22&1)&(d>>21&1)&(d>>20&1)&(d>>19&1)&(d>>18&1)&(d>>17&1)&(d>>16&1)&(d>>15&1)&(d>>14&1)&(d>>13&1)&(d>>12&1)&(d>>11&1)&(d>>10&1)&(d>>9&1)&(d>>8&1)&(d>>7&1)&(d>>6&1)&(d>>5&1)&(d>>4&1)&(d>>3&1)&(d>>2&1)&(d>>1&1)&(d&1));

}


1
! 不是位运算符。 - Fred Larson
@FredLarson 这不就相当于与全1异或吗? - Max
1
@Max:不是,但是~是。 - Fred Larson
1
@JimMischel,它不会失败。它可以正常工作。我甚至已经编写了代码。 - LearningC
1
@JimMischel ~((0^1)|(1^0))==~(1|1)==~1==0 @JimMischel ~((0^1)|(1^0))==~(1|1)==~1==0 - Max
显示剩余6条评论

4

@LearningC 的回答 的基础上构建:

int check(int a,int b,int c)
{
    return !((a^b)|(b^c));
}

如果您不想要感叹号!
int check(int a,int b,int c)
{
    unsigned int d = (unsigned int) ((a^b)|(b^c)); /* 0 if equal, non-zero otherwise */
    d |= d>>32; /* set bit n if bit n+32 set - only needed for 64 bit int platforms */
    d |= d>>16; /* set bit n if bit n+16 set */
    d |= d>>8; /* set bit n if bit n+8 set */
    d |= d>>4; /* set bit n if bit n+4 set */
    d |= d>>2; /* set bit n if bit n+2 set */
    d |= d>>1; /* set bit n if bit n+1 set */
    return (int)((~d) &1);
}

我认为这个比他的简单一些。


对于 d |= d>>32 实现各种 int 大小,给予加分。 - chux - Reinstate Monica

1
int isEqualThree(int x, int y, int z) {
    int a=(x^y);
    int b=(y^z);

    return !(a|b);

}

两个数字进行xor运算,只有当它们的所有位都相同时结果才为零。因此,如果ab中任意一个不为零,则说明至少有一个数字与另外两个数字不同。在这种情况下返回零,否则返回一,这就解释了return !(a|b);。保留html标签。

我认为问题的本质是要制定一系列预测的位运算,这将排除使用分支。 - Tyler Durden
不,我不能使用“if”,也不知道如何使用位运算来创建一个。 - user3316874
! 不是位运算符。 - Fred Larson
答案没有解释,但是似乎是只使用位运算符的最佳答案,所以+1。 - anatolyg
不确定“which explains return ~(a|b);”如何解释return !(a|b); - chux - Reinstate Monica
显示剩余2条评论

0
如果“==”是可以接受的,那么也有以下方法:
int check( int x, int y, int z ) { return (x | y | z) == (x & y & z); }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接