【问题标题】:Replacing “!=” with bitwise operators用位运算符替换“!=”
【发布时间】:2012-09-14 09:33:20
【问题描述】:

仅使用位运算符(|, &, ~, ^, >>, <<),是否可以替换下面的!=

// ...
if(a != b){
    // Some code
}
/// ...

这主要是出于个人利益,因为我看到了如何使用 == 而不是 !=

【问题讨论】:

  • a 和 b 是 uint?还是字符串?
  • 按位运算对字符串有何意义?
  • 不是按位,但还值得一提? if(a<b || a>b)
  • @ajax333221 顺便说一句,您的解决方案对于浮点数并不完全正确; NaN 既不小于也不大于任何其他值。
  • @willglynn 我怀疑是neither equal(注意:至少在 JavaScript 中是这样)

标签: c binary bit-manipulation


【解决方案1】:
if(a ^ b) {
    //some code
}

应该可以。

您也可以对== 使用您喜欢的方法,并在其后面添加^ 0xFFFFFFFF(使用适当数量的 F 以匹配数据类型的长度)。这会否定该值(与前面的 ! 相同)。

【讨论】:

  • 如果 XOR 不可用,也可以将 (a XOR b) 表示为 (((NOT a) AND b) OR (a AND NOT(b)))
【解决方案2】:

a != b 表示ab 的位表示中至少有一个不同的位。如果两个输入位操作数不同,XOR 位运算符返回 1,否则返回 0。

因此,您可以对ab 应用异或运算并检查结果是否不等于0。

【讨论】:

    【解决方案3】:

    '!=' 测试的按位版本可能类似于:

    if((a - b) | (b - a)) {
        /* code... */
    }
    

    这两个减法的或。如果两个数字相同,则结果将为 0。但是,如果它们不同(也就是 '!=' 运算符),则结果将为 1。

    注意:上面的 sn-p 只适用于整数(这些整数可能应该是无符号的)。

    但是,如果您想模拟 '==' 运算符,请查看 Fabian Giesen 在Replacing "==" with bitwise operators 中的回答

    【讨论】:

      【解决方案4】:

      x ^ y 并不总是足够的。使用!!(x ^ y)。期望返回值一位的值不适用于 x ^ y,因为它留下的余数可能大于 1。

      【讨论】:

        【解决方案5】:

        是的,使用这个:

        if (a ^ b) { }
        

        【讨论】:

          【解决方案6】:

          "~" 等于 NOT 所以应该可以工作。例如“a & ~b”。

          【讨论】:

          • 15 & ~0 = 15。你需要更多地考虑二进制
          猜你喜欢
          • 2011-05-08
          • 1970-01-01
          • 2017-11-06
          • 1970-01-01
          • 2012-03-13
          • 1970-01-01
          • 2015-11-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多