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

时间:2014-03-04 15:41:47

标签: c bit-manipulation bitwise-operators

使用严格按位运算,我如何确定三个数字是否相等。到目前为止,我有如下所示的代码,但它不适用于像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 个答案:

答案 0 :(得分: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 :(得分:4)

以@ Rohith的答案为基础

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);
}
我相信它比他更简单。

答案 2 :(得分:1)

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

    return !(a|b);

}
只有当数字的所有位相同时,两个数字中的{p> xor才为零。因此,从上面来看,如果ab非零,那么它意味着至少有一个数字与其他两个数字不同。所以在这种情况下,返回零,否则为1,这解释了return !(a|b);

答案 3 :(得分:0)

如果==可以接受,那么还有

int check(int x,int y,int z) { return(x | y | z)==(x& y& z); }