java - f(int x) { 返回 x == 0 ? 0 : 1; } in Java without conditionals

标签 java bit-manipulation

我想实现 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;
}

)

编辑:

所以,我对三种不同的解决方案进行了微基准测试:

  1. 我的返回 x/x 捕获解决方案,
  2. 明显的 x==0?0:1 解决方案,以及
  3. 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/

相关文章:

java - Maven:将本地依赖添加到jar

java - 仅加密图像文件的内容而不是整个文件

.net - 如何检查两个位掩码之间是否存在公共(public)位?

c++ - 查找数字是否为2的幂的时间复杂度

java - 如何正确混合两种int颜色

java - 将类似项目符号的符号插入文本字段

java - 在非主类中创建PApplet

java - 使用Java Regex解析xml文件

java - 什么时候抛出java异常

c - 添加与 ORing 性能