Mat*_*agé 2 c++ bit-manipulation
我试图找到一种有效的方法来检查整数是否为零而不跳跃.
我有两个整数变量in和out.如果in为零,我想out成为零.如果in不是零,我想成为一个.
如果它有帮助,我知道in它将为零或2的幂(只有一个设置位).我也知道从未设置过最重要和最不重要的位.
我可以做到显而易见:out = (in == 0 ? 0 : 1);但这意味着跳跃是昂贵的.
我可以做这样的事情out = (in * 0xFFFFFFFF) >> 63;.这意味着我想避免的乘法和转移,但我找不到方法.也许这是不可能的.
任何其他方式我可以做到这一点没有跳跃,只使用逐位运算符和算术?
谢谢
这将与架构不同,但代码不能编译为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:
这只是一个没有优化的跳跃,你永远不会做.