使用按位运算符在C中最多两个数字

可能重复:
在不使用if-else或任何其他比较运算符的情况下查找最多两个数字

更伟大:

if x > y then return 1, else return 0 

例:

  • isGreater(4,5)= 0
  • isGreater(5,4)= 1

合法经营者: ! ~ & ^ | + <> ! ~ & ^ | + <>

isGreater是function..

我试过了:

 int isGreater(int x, int y) { return (y+(~x+1)) >> 31 & 1; } 

但不工作.. :((让我知道我还能做些什么?

给定x,y

尝试x + -y如果<0则y更大,如果> 0则x更大。

-y = y的二进制补码:

 -y = (~(y-1)) <==> -y = (~y)+1 

从我看到的,你用(~y +1))做二进制补码,这是相同的。

然后bitshift >> 31得到MSB,等于1。
确保设置parantheses,运算符优先级!

  (y+-x) >> (31 & 1); != ((y+-x) >> 31) & 1; 

太容易了 – 因为你在合法操作符列表中有+ ,你可以简单地合成- (正如其他人注意到的那样)然后做一个减法并提取符号。 如果你省略+ (因为它不是一个按位运算符)并且只用按位运算( & | ^ ~ )和移位来回答问题就会更有趣。

当然,你可以从按位运算和移位中合成+ / -但实际上有一种更简单的方法。