为啥这比函数有效?

Posted

技术标签:

【中文标题】为啥这比函数有效?【英文标题】:Why does this greater than function work?为什么这比函数有效? 【发布时间】:2014-11-04 16:30:11 【问题描述】:

我正在做一个家庭作业,我们应该创建一个名为 isGreater(x,y) 的函数,如果 x 大于 y,它会返回,但我们只能将位运算符与 + 和 ! 一起使用。我已经解决了这个问题,使用规则如果 x 和 y 有不同的符号,那么 x >= 0 和 y

但是,当我环顾其他人如何解决它时,我注意到以下方法无论出于何种原因都能正常工作。

y = ~y;   
return !(((x&y) + ((x^y) >> 1)) >> 31); 

我一生都无法理解为什么会这样,我认为这与 x 中未设置在 y 中的第一位有关吗?

注意:显然,如果 x 和 y 是整数,而不是无符号整数,这只是一个有效的解决方案。

【问题讨论】:

这是允许的,还有 !操作员。该解决方案完全有效。 对不起,我犯了一个错误,没有包括 + 和 !运营商。 如果我没记错的话,如果 x 为 1,y 为 1,则返回 1。那么函数应该是 isGreaterOrEqual(x,y) 不,这很奇怪,我也这么认为,但如果 x 为 1 且 y 为 1,则返回 0。 不,它没有:ideone.com/FPpMKh 【参考方案1】:

31 表示我们只对符号感兴趣。 如果 ((x&y) + ((x^y) >> 1)) > 0 那么 x > ~y。 x & ~y 将产生一个数字,其中 MSB 将是第一个位,其中 x 有一个设置位,y 有一个 0。x^~y 将产生一个数字,其中未设置位将表示 x 和 y 不同的位。如果我们将其右移一位,我们需要它们的总和变为正数。仅当 x&y 的第一个非零位(表示设置 x 且 x 和 y 不同的第一位)与 ((x^y) >> 1) 中的设置位相遇时才会发生这种情况(表示第一个位设置在一个中,但未设置在另一个中)。 如果最高位在 x 中设置但在 y 中未设置,则最高位在一个中设置但在另一个中未设置 - 这意味着 x 大于 y。

例子:

(shft is x^~y >> 1, res is shft + x&~y)

x:   000110
y:   001010
~y:  110101
x&~y:000100
x^~y:110011
shft:111001
res: 111101 -> negative

x:   000110
y:   000010
~y:  111101
x&~y:000100
x^~y:111011
shft:111101
res: 000001 -> positive

这就是为什么它不适用于未签名的 BTW(那里没有签名)。

【讨论】:

还应注意右移带符号的数字在 C 标准中取决于实现。所以这可能不适用于其他编译器

以上是关于为啥这比函数有效?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在函数内部使用引用并通过引用返回它仍然有效? [复制]

为啥此代码有效(具有无效非模板函数的 C++ 模板类)? [复制]

R 不一致:为啥 add=T 有时有效,有时在 plot() 函数中无效?

为啥 cffi 比 numpy 快这么多?

为啥 Rust 函数和 FFI C++ 函数以相反的顺序执行?

为啥枚举的构造函数不能访问静态字段?