Я хочу написать функцию, которая принимает значение типа 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);
}
Это довольно некрасиво. А условные выражения могут изменить поток управления, поэтому они стоят дороже, чем простые арифметические операции. Я мог бы просто предварительно вычислить маски и поместить их в статический массив, но доступ к массиву также дороже, чем простые арифметические операции, возможно, даже дороже, чем условные.
Есть ли разумный способ написать это без условия? Этот код будет выполняться миллионы раз в секунду, поэтому он должен быть быстрым.