【问题标题】:Implement greater equal sign in C using only bitwise operations仅使用按位运算在 C 中实现更大的等号
【发布时间】:2018-10-13 01:57:10
【问题描述】:

我知道在 C 中也可以仅使用位运算符来实现许多基本运算,例如加法或除法。如何对大于或等于号 (>=) 执行相同操作?

if (x >= 0) {
    ...
}

【问题讨论】:

  • 呃,是的,我总是混淆这些......
  • if (~~~((x>>(CHAR_BIT*sizeof(int)-1))&~~~0))。享受吧。
  • @Lundin 如果这可以作为答案发布
  • @TheUnfunCat 它可以工作,但它使用非按位运算符。虽然感觉这个问题应该得到这样的答案。

标签: c comparison bit-manipulation bitwise-operators


【解决方案1】:

我能想到的最简单的解决方案:

#include <limits.h>

if ((x & INT_MAX) == x)    // if (x >= 0)
    ...

如果您不喜欢 ==,请使用 XOR 进行等号测试:

#include <limits.h>

if ((x & INT_MAX) ^ x)    // if (x < 0)
    ...
else                      // else x >= 0
    ...

【讨论】:

  • if 包含隐式比较,因此它不仅仅是严格意义上的按位运算。
  • @icepack:我这样表达是为了与原始问题保持一致 - 如果 OP 想要除此之外的其他内容,那么他​​需要明确说明。
  • 我不确定为什么每个答案都被否决了,但话说回来,这首先不是一个好问题。
【解决方案2】:

如果你只想要if (x &gt;= 0)那么这就足够了

if (~x & INT_MIN)

如果您的意思是两个数字之间的“大于或等于”,那么差异会更大

【讨论】:

    【解决方案3】:

    如果您只能使用按位运算符,甚至禁用比较运算符,这是不可能的(实际上,几乎没有什么可能)。隐式比较总是存在的,即使像 if(x some bitwise stuff) 这样的操作实际上在生成的汇编代码中也被解释为等同于 if(x some bitwise stuff) != 0)

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 2013-07-25
      相关资源
      最近更新 更多