Я хочу написать функцию, которая принимает int от 1 до 64 и возвращает соответствующую "битовую маску" с таким же количеством битов 1, как на входе.
Я начал так:
/** Computes a bitmaks */
private static long mask(final int bitsPerValue) {
return (1L << bitsPerValue) - 1L;
}
Но понял, что это дает неправильное значение для 64:
(1L << 64) - 1L == 1L - 1L == 0
Теперь у меня вот так:
/** Computes a bitmaks */
private static long mask(final int bitsPerValue) {
return (bitsPerValue == 64) ? -1 : ((1L << bitsPerValue) - 1L);
}
Это довольно уродливо. К тому же условия могут изменить поток управления, поэтому они дороже простых арифметических операций. Я мог бы просто предварительно вычислить маски и поместить их в статический массив, но доступ к массиву также дороже, чем простые арифметические операции, возможно, даже дороже, чем условие.
Есть ли разумный способ написать это без условия? Этот код будет выполняться миллионы раз в секунду, поэтому он должен быть быстрым.