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

我想知道是否有一种方法可以在不使用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语句方式更慢(这不一定是低效的,只有一个弱点)。

除了if之外,你不能使用布尔值。 但是,这并不意味着在assembly级别会有一个分支。

如果检查该方法的已编译代码(顺便说一下,使用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上获得不同的结果。

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

您可以使用三元运算符 :

 return b ? 1 : 0; 

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

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

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

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

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

然后在方法中:

 return map.get(b); 

否则,你可以使用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) 

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

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

这不是直接可能的,不管是Java。 如果你真的需要避免分支,你可以考虑直接使用intbyte而不是boolean

在这种情况下,VM也可能足够聪明以消除分支( if?: :)本身,因为boolean的内部表示很可能是文字1或0。 这篇文章介绍了如何检查生成的Oracle JDK本机代码,如果需要速度,请确保使用“服务器”JVM, 因为它执行比“客户端” 更优化的优化 。

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

 -Boolean.FALSE.compareTo(value) 

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

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

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

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

为了避免使用“if”,三元组的合理替代方案:

 private static Boolean[] array = {false, true}; int boolToInt( boolean b ){ return Arrays.binarySearch(array, b); } 

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

 int ansInt = givenBoolean ? 1 : 0; 

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

 int value = flag ? 1 : 0;