考虑到大小为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;
}
...但我真的想避免在那里出现一个不可预测的分支。
答案 0 :(得分:3)
您可以使用第7位的反转并移位:
long x = (size >> 6) ^ 1;
return (x << size) - 1;
size = 64
此设置x = 0
和(0 << whatever) - 1
显然是-1。
在其他情况下,它会简化为旧(1L << size) - 1
。