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

时间:2013-06-01 01:31:55

标签: java if-statement casting integer boolean

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

int boolToInt( boolean b ){
  if ( b )
    return 1
  return 0

但是我想知道是否有办法在没有if语句的情况下做到这一点,比如Python的

bool = True 
num = 1 * ( bool )

我也认为你可以做到

boolean bool = True;
int myint = Boolean.valueOf( bool ).compareTo( false );

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

12 个答案:

答案 0 :(得分:25)

除了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  

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

答案 1 :(得分:12)

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

答案 2 :(得分:4)

您可以使用ternary operator

return b ? 1 : 0;

如果这被认为是“if”,并且这是一个“谜题”,你可以使用这样的地图:

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

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

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

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

然后在方法中:

return map.get(b);

答案 3 :(得分:4)

否则,你可以使用Apache Commons BooleanUtils.toInteger方法,它就像魅力......

// Converts a boolean to an int specifying the conversion values.    
static int  toInteger(boolean bool, int trueValue, int falseValue)

// Converts a Boolean to an int specifying the conversion values.
static int  toInteger(Boolean bool, int trueValue, int falseValue, int nullValue)

答案 4 :(得分:2)

我通过框架找到了解决方案。使用比较布尔值。

// b = Your boolean result
// v will be 1 if b equals true, otherwise 0
int v = Boolean.compare(b, false);

答案 5 :(得分:1)

这不是直接可能的,不管是Java还是如此。如果您确实需要避开分支,可以考虑直接使用intbyte而不是boolean

在这种情况下,VM也可能足够聪明以消除分支(if?:)本身,因为boolean的内部表示很可能无论如何,要是文字1或0。 Here is an article关于如何检查生成的Oracle JDK本机代码,如果需要速度,请确保使用“服务器”JVM as it performs more aggressive optimization而不是“客户端”。

答案 6 :(得分:1)

我不能说我推荐这个。它本身比三元运算符慢,并且它太聪明而不能被称为良好的编程,但就是这样:

-Boolean.FALSE.compareTo(value)

它使用了封底下的三元组(后面的几个方法调用),但它不在你的代码中。公平地说,我愿意打赌在Python执行的某个地方也有一个分支(虽然我可能只打赌镍;))。

答案 7 :(得分:0)

您可以尝试使用这样的三元运算符

int value = flag ? 1 : 0;

答案 8 :(得分:0)

既然你不想if / else解决方案你的表达是完美的,虽然我会略微改变它

int myint = Boolean.valueOf( bool ).compareTo( Boolean.FALSE );

没有涉及对象创建,Boolean.valueOf(boolean b)返回Boolean.TRUE或Boolean.FALSE,请参阅API

答案 9 :(得分:0)

一种合理的替代方案,可以避免使用“if”:

private static Boolean[] array = {false, true};

int boolToInt( boolean b ){
    return Arrays.binarySearch(array, b);
}

请注意,我认为这是一个“谜题”问题,所以如果我自己编码,我会使用三元组。

答案 10 :(得分:0)

int ansInt = givenBoolean ? 1 : 0;

答案 11 :(得分:0)

如今,jdk提供了一种有用的Utils方法:BooleanUtils.toInteger()

在源代码中,jdk实现它的方法必须高效:

public static int toInteger(boolean bool) {
    return bool ? 1 : 0;
}

因此,我认为投票最多的答案非常好,return bool ? 1 : 0是最佳实践。

使用BooleanUtils的示例代码如下:

BooleanUtils.toInteger(false);