我想编写一个函数,它采用 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);
}
比较难看。并且条件可以改变控制流,因此它们比简单的算术运算更昂贵。我可以预先计算掩码并将它们放入静态数组中,但数组访问也比简单的算术运算更昂贵,甚至可能比条件更昂贵。
有没有一种合理的方式来写这个没有条件?这段代码每秒要运行无数次,所以它必须很快。