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

C 如何确定三个数字是否相等,c,bit-manipulation,bitwise-operators,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; }

使用严格的按位运算,如何确定三个数字是否相等。到目前为止,我有下面显示的代码,但它不适用于像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;
}
只有当两个数字的所有位都相同时,两个数字的异或才为零。因此,从上面看,如果
a
b
为非零,则表示至少有一个数字与其他两个不同。在这种情况下,返回0或者1,这就解释了
return!(a | b)

试试这个

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));

}

基于@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);
}

我认为这比他的简单一点。

如果==可以接受,那么

整数检查(整数x,整数y,整数z) { 返回(x | y | z)==(x&y&z);
}

“仅使用位运算。”你不能使用
if
。我认为问题的实质是制定一系列位运算的谓词,这样就排除了分支的使用。不,我不能使用if,我不知道如何使用位运算
不是按位操作。我的错误。我确信你有
a=!(x^y)
不是按位运算。@Fredrarson不是等于所有的异或运算吗?@Max:不是,但是
~
是。@JimMischel它没有失败。它很好用。我甚至还编了密码it@JimMischel
~(0^1)|(1^0))==~(1 | 1)==0
+1,用于实现各种
int
大小的
32
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);
}