我想实现 f(int x) { return x == 0 ? 0:1; }
在 Java 中。
在 C 中,我只需要“return !!x;
”,但 !
在 Java 中却不能这样工作。有没有什么方法可以不用条件?没有像展开版
int ret = 0;
for (int i = 0; i < 32; i++) {
ret |= ((x & (1 << i)) >>> i);
}
或
try {
return x/x;
} catch (ArithmeticException e) {
return 0;
}
)
编辑:
所以,我对三种不同的解决方案进行了微基准测试:
- 我的返回 x/x 捕获解决方案,
- 明显的 x==0?0:1 解决方案,以及
- Ed Staub 的解决方案:(x|-x) >>> 31.
随机 int 输入(整个 int 范围)的时序是:
1. 0.268716
2. 0.324449
3. 0.347852
是的,我愚蠢的 x/x 解决方案速度快了很多。考虑到其中的 0 很少,并且在绝大多数情况下采用快速路径,这并不奇怪。
50% 的输入为 0 的更有趣情况的时序:
1. 1.256533
2. 0.321485
3. 0.348999
简单的 x==0?0:1
解决方案比聪明的解决方案(在我的机器上)快约 5%。明天我会尝试做一些反汇编来找出原因。
EDIT2: 好的,所以条件版本的反汇编是(不包括簿记):
testl rsi,rsi
setnz rax
movzbl rax,rax
(x|-x)>>>31 的反汇编是:
movl rax,rsi
negl rax
orl rax,rsi
sarl rax,#31
我觉得没什么好说的了。
最佳答案
好的,没有条件的最短解决方案可能是:
return (i|-i) >>> 31;
关于java - f(int x) { 返回 x == 0 ? 0 : 1; } in Java without conditionals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6628495/