Могу ли я создать битовую маску от 1 до 64 бит без условий в Java?

Я хочу написать функцию, которая принимает 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);
}

Это довольно уродливо. К тому же условия могут изменить поток управления, поэтому они дороже простых арифметических операций. Я мог бы просто предварительно вычислить маски и поместить их в статический массив, но доступ к массиву также дороже, чем простые арифметические операции, возможно, даже дороже, чем условие.

Есть ли разумный способ написать это без условия? Этот код будет выполняться миллионы раз в секунду, поэтому он должен быть быстрым.

5
задан Sebastien Diot 23 January 2012 в 11:02
поделиться