Quiero escribir una función que toma un int entre 1 y 64, y devuelve una "máscara de bits" apropiada, con tantos 1 bits como la entrada.¿Puedo crear una máscara de bits de 1 a 64 bits sin condicional en Java?
empecé así:
/** Computes a bitmaks */
private static long mask(final int bitsPerValue) {
return (1L << bitsPerValue) - 1L;
}
pero se dio cuenta que le da el valor incorrecto para el 64:
(1L << 64) - 1L == 1L - 1L == 0
Ahora tengo unas pocas cosas:
/** Computes a bitmaks */
private static long mask(final int bitsPerValue) {
return (bitsPerValue == 64) ? -1 : ((1L << bitsPerValue) - 1L);
}
Es bastante feo. Y los condicionales pueden cambiar el flujo de control, por lo que son más caros que las operaciones aritméticas simples. Podría precomputar las máscaras y ponerlas en una matriz estática, pero el acceso a la matriz también es más costoso que las simples operaciones aritméticas, probablemente incluso más costoso que el condicional.
¿Hay alguna manera razonable de escribir esto sin un condicional? Este código va a correr por billones de tiempo por segundo, así que tiene que ser rápido.
¿Le hiciste un perfil a esto?¿De verdad ves alguna diferencia significativa si solo dejas que se ejecute sin los resultados condicionales e incorrectos, frente a los resultados condicionales y correctos? – ziesemer
¿Es esto para un motor de ajedrez basado en bitboard? :-) –
@ziesemer - Apuesto a que no verá ninguna diferencia (de hecho, si 64 se demanda con frecuencia, podría ser incluso más rápido). El problema es que las personas están tan obsesionadas con el rendimiento, pero no saben cómo funcionan los JIT y las CPU ... simplemente piensan que el tiempo de ejecución será proporcional al tamaño de la expresión java en los caracteres ..... – Ingo