检查是否至少设置了一个没有跳跃的位

Mat*_*agé 2 c++ bit-manipulation

我试图找到一种有效的方法来检查整数是否为零而不跳跃.

我有两个整数变量inout.如果in为零,我想out成为零.如果in不是零,我想成为一个.

如果它有帮助,我知道in它将为零或2的幂(只有一个设置位).我也知道从未设置过最重要和最不重要的位.

我可以做到显而易见:out = (in == 0 ? 0 : 1);但这意味着跳跃是昂贵的.

我可以做这样的事情out = (in * 0xFFFFFFFF) >> 63;.这意味着我想避免的乘法和转移,但我找不到方法.也许这是不可能的.

任何其他方式我可以做到这一点没有跳跃,只使用逐位运算符和算术?

谢谢

Jer*_*iah 6

这将与架构不同,但代码不能编译为Intel CPU上的跳转.

这段代码:

int square(int in) {
    int out = (in != 0);
    return out;
}
Run Code Online (Sandbox Code Playgroud)

编译为:

square(int):
    xor     eax, eax
    test    edi, edi
    setne   al
    ret
Run Code Online (Sandbox Code Playgroud)

要么:

square, COMDAT PROC
    xor      eax, eax
    test     ecx, ecx
    setne    al
    ret      0
square ENDP
Run Code Online (Sandbox Code Playgroud)

通过msvc,clang和gcc与O2:

这只是一个没有优化的跳跃,你永远不会做.