给定掩码大小,有效地创建具有低位设置的掩码

时间:2016-11-23 22:34:44

标签: java optimization bit-manipulation

考虑到大小为size的掩码的大小,我想创建一个long mask,其中掩码集的底部为size位,高位为零。例如,size == 4的掩码为0b1111(又名0x0000000000000000F),依此类推。 size必须在0 <= size <= 64范围内。

对于所有输入的典型尝试如下:

long makeMask(int size) {
  return (1L << size) - 1;
}

...但是对于size == 64失败,返回0而不是预期的all-1:0xFFFFFF....。对于int个屏蔽,我可以转发到long以避免此问题,但对于long我看不到类似的解决方法。

我可以这样做:

long makeMask(int size) {
  return size == 64 ? -1L : (1L << size) - 1;
}

...但我真的想避免在那里出现一个不可预测的分支。

1 个答案:

答案 0 :(得分:3)

您可以使用第7位的反转并移位:

long x = (size >> 6) ^ 1;
return (x << size) - 1;

size = 64此设置x = 0(0 << whatever) - 1显然是-1。

在其他情况下,它会简化为旧(1L << size) - 1