1 から 64 までの int を取り、適切な「ビットマスク」を返す関数を書きたいと思います。入力と同じ数の 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);
}
それはかなり醜いです。また、条件は制御フローを変更する可能性があるため、単純な算術演算よりもコストがかかります。マスクを事前に計算して静的配列に入れることもできますが、配列へのアクセスは単純な算術演算よりもコストがかかり、おそらく条件付きよりもさらに高価です。
条件なしでこれを書く合理的な方法はありますか? このコードは毎秒何億回も実行されるため、高速である必要があります。