Conversión de Boolean a Integer en Java sin instrucciones-If

Me pregunto si hay una manera de convertir un booleano en un int sin usar las sentencias if (para no romper la tubería). Por ejemplo, podría escribir

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

Pero me pregunto si hay una manera de hacerlo sin la statement if, como Python’s

 bool = True num = 1 * ( bool ) 

También me imagino que podrías hacer

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

Sin embargo, esto crea un objeto adicional, por lo que es realmente un desperdicio y encontré que es incluso más lento que la forma if-statement (que no es necesariamente ineficiente, solo tiene la única debilidad).

No puedes usar un booleano que no sea en un if. Sin embargo, esto no significa que habrá una twig en el nivel de ensamblaje.

Si verifica el código comstackdo de ese método (por cierto, usando return b ? 1 : 0; comstack exactamente las mismas instrucciones), verá que no usa un salto:

 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 

Nota: esto está en el servidor de punto de acceso 7: puede obtener resultados diferentes en una máquina virtual diferente.

Utilice el operador?: ( b ? 1 : 0 )

Puede utilizar el operador ternario :

 return b ? 1 : 0; 

Si esto se considera un “si”, y dado que es un “rompecabezas”, podría usar un mapa como este:

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

Aunque en teoría, la implementación de HashMap no necesita usar un if, en realidad lo hace. Sin embargo, el “si” no está en su código.

Por supuesto para mejorar el rendimiento, deberías:

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

Luego en el método:

 return map.get(b); 

De lo contrario, podría usar el método Apache Commons BooleanUtils.toInteger que funciona como un encanto …

 // 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) 

He encontrado una solución por marco. Utilice comparar para Boolean.

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

Esto no es directamente posible, tampoco en Java. Puede considerar usar directamente un int o un byte lugar de un boolean si realmente necesita evitar la twig.

También es posible que la VM sea lo suficientemente inteligente como para eliminar la twig (el if o ?: 🙂 En este caso, ya que la representación interna del boolean probablemente sea el literal 1 o el 0 de todos modos. Aquí hay un artículo sobre cómo examinar el código de máquina nativo generado para el JDK de Oracle y, si necesita velocidad, asegúrese de usar el JVM de “servidor” ya que realiza una optimización más agresiva que la del “cliente”.

No puedo decir que recomiendo esto. Es más lento que el operador ternario por sí mismo, y es demasiado inteligente para llamarlo buena progtwigción, pero esto es lo siguiente:

 -Boolean.FALSE.compareTo(value) 

Utiliza el ternario debajo de las coberturas (un par de métodos luego), pero no está en su código. Para ser justos, estaría dispuesto a apostar que también hay una twig en algún lugar de la ejecución de Python (aunque probablemente solo apuesto un centavo;)).

Ya que no quieres una solución if / else tu expresión es perfecta, aunque la cambiaría ligeramente

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

No hay creación de objetos involucrada, Boolean.valueOf (boolean b) devuelve Boolean.TRUE o Boolean.FALSE, vea API

Una alternativa razonable a la ternaria para evitar un “si”:

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

Tenga en cuenta que considero la pregunta de este “rompecabezas”, así que si la codificara yo mismo usaría el ternario …

 int ansInt = givenBoolean ? 1 : 0; 

Puedes intentar usar el operador ternario así

 int value = flag ? 1 : 0;