这个min()函数是如何工作的
How does this min() function work?
我遇到了这个代码:
int __min(int a, int b) {
return ((a)-(((a)-(b))&((b)-(a))>>31));
}
我可以想象它与2s补码有关,它只适用于有符号的32位整数,但在那之后我就迷失了方向。
我发现了这个问题,但我不认为这些功能是相关的,还是我错了?
所以我有两个问题:
- 为什么这个功能有效
- 有没有
(a<b)?a:b
不起作用,而这个函数会起作用,或者这个函数只是为了好玩而过于复杂
编辑:该函数是为GPU编写的,所以我认为@Banex这样编写它的目的可能是为了避免分支。
这是为32位有符号值设计的。让我们一步一步地把它分解。
((b)-(a))>>31)
右移运算符基本上取32位值中的最高位,并将其符号扩展到剩余的31位。这就是右移运算符处理带符号值的方式。
如果b
大于a
,则减法的结果将为正,最高位将为0,并且其结果为0。
如果b
小于a
,则减法的结果将为负,最高位将为1,并且减法的结果为-1。最高的比特被向下移位到所有剩余的比特。将设置32位值中的所有位,即-1。
您可以通过编写一个短程序来验证这一点,该程序将正值或负值放入32位的int
中,并将其右移31位;则观察到结果将是0或-1。如您所知,在二进制补码运算中,值-1
的所有位都已设置。
((a)-(b)) & (0 or -1, as the result of the previous operation).
因此,如果b
小于a
,则右侧值设置了所有位,并且逐位&
运算符的结果是左侧值。或CCD_ 11。
如果b
大于a
,则右侧的值具有所有比特0,并且&
的结果为0。
结论:
如果b
小于a
,则上述表达式的计算结果为:
a-(a-b)
or
a-a+b
or
b
如果b
大于a
,则表达式的结果为
a - 0
or
a
表达式
((a)-(b))&((b)-(a))>>31
即没有大多数多余的括号
(a - b) & (b - a) >> 31
评估为
a - b
如果a>b,则返回
0
否则,如果它最终从a中减去,它与相同
if (a > b)
return (a - (a - b));
else
return (a - 0);
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个