在没有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。 如果你真的需要避免分支,你可以考虑直接使用int
或byte
而不是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;