为啥这比函数有效?
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() 函数中无效?