【问题标题】:Maximum of two number in C using bitwise operators [duplicate]使用按位运算符在C中最多两个数字[重复]
【发布时间】:2011-01-25 21:54:28
【问题描述】:

可能重复:
Find the maximum of two numbers without using if-else or any other comparison operator

更大:

if x > y  then return 1, else return 0 

例子:

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

合法运营商:! ~ & ^ | + << >>

isGreater 是函数..

我试过了:

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

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

【问题讨论】:

  • “我如何用 C 运算符的一些有限子集做 X?”的源源不断的流是怎么回事?输入问题?
  • 第 1 步。请使用 {} 按钮格式化您的代码。第 2 步。请用 [homework] 标签标记您的作业。
  • @Oli,显然这是一个常见的家庭作业。
  • 标题说“两个数字的最大值”,而问题本身表明您只想测试x > y - 这是它???
  • 这是一个合理的家庭作业数学课,而不是编程课。

标签: c


【解决方案1】:

给定 x, y

试试 x + -y 如果 0 则 x 更大。

-y = y 的二进制补码:

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

据我所知,您使用 (~y +1)) 进行二进制补码,这是相同的。

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

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

【讨论】:

  • @Paul 显然你没有阅读他的回答
【解决方案2】:

太简单了——因为您在合法运算符列表中有+,您可以简单地合成-(正如其他人所注意到的),然后进行减法并提取符号。如果您省略+(因为它不是按位运算符)并仅通过按位运算(&amp;|^~)和移位来回答问题,它会更有趣。

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

【讨论】:

  • 这种限制确实使它更有趣,尽管我不能凭良心 +1,因为你真的在问一个单独的问题。我想到的解决方案需要 5 次右移,我怀疑这是可能的最小次数。
猜你喜欢
  • 2023-03-21
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多