在没有If-Statements的情况下在Java中将Boolean转换为Integer

en_*_*ght 19 java integer casting if-statement boolean

我想知道是否有办法将布尔值转换为int而不使用if语句(以免破坏管道).例如,我可以写

int boolToInt( boolean b ){
  if ( b )
    return 1
  return 0
Run Code Online (Sandbox Code Playgroud)

但是我想知道是否有办法在没有if语句的情况下完成它,就像Python一样

bool = True 
num = 1 * ( bool )
Run Code Online (Sandbox Code Playgroud)

我也认为你可以做到

boolean bool = True;
int myint = Boolean.valueOf( bool ).compareTo( false );
Run Code Online (Sandbox Code Playgroud)

但是这会创建一个额外的对象,所以它真的很浪费,我发现它甚至比if语句方式更慢(这不一定是低效的,只有一个弱点).

ass*_*ias 27

除了if之外,你不能使用布尔值.但是,这并不意味着在装配层面会有一个分支.

如果检查该方法的已编译代码(顺便说一句,使用return b ? 1 : 0;编译完全相同的指令),您将看到它不使用跳转:

0x0000000002672580: sub    $0x18,%rsp
0x0000000002672587: mov    %rbp,0x10(%rsp)    ;*synchronization entry
0x000000000267258c: mov    %edx,%eax
0x000000000267258e: add    $0x10,%rsp
0x0000000002672592: pop    %rbp
0x0000000002672593: test   %eax,-0x2542599(%rip)        # 0x0000000000130000
                                                ;   {poll_return}
0x00000000025b2599: retq  
Run Code Online (Sandbox Code Playgroud)

注意:这是在热点服务器7上 - 您可能在不同的VM上获得不同的结果.


Sha*_*Man 12

使用?:运算符: ( b ? 1 : 0 )

  • 我相信三元运算符只是一个if-statemnent的糖.这是不正确的? (4认同)

Boh*_*ian 5

您可以使用三元运算符

return b ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

如果这被认为是“如果”,并且考虑到这是一个“谜题”,那么您可以使用如下地图:

return new HashMap<Boolean, Integer>() {{
    put(true, 1);
    put(false, 0);
}}.get(b);
Run Code Online (Sandbox Code Playgroud)

虽然理论上HashMap的实现不需要使用if,但实际上是需要的。然而,“if”不在您的代码中。

当然,为了提高性能,您会:

private static Map<Boolean, Integer> map = new HashMap<Boolean, Integer>() {{
    put(true, 1);
    put(false, 0);
}};
Run Code Online (Sandbox Code Playgroud)

然后在方法中:

return map.get(b);
Run Code Online (Sandbox Code Playgroud)

  • 我认为 HashMap 因其最慢的实现方式而获奖。 (8认同)