如何确定 64 位值中第 n 个最高有效位组的位置?
我在 Java 程序中使用一些长值作为位图。到目前为止,这是我的方法:
public class BitmapUtil
{
private static final long _B_MASK_LEFT_ON = 0x8000000000000000L;
public static long setNthMsb(int n)
{
return BitmapUtil._B_MASK_LEFT_ON >>> n;
}
public static boolean isNthMsbSet(long b, int n)
{
return (b & (BitmapUtil.setNthMsb(n))) != 0L;
}
public static int getNthMsbPosition(long b, int n)
{
int ix = 0;
while (ix < 64 && n >= 0) {
if (BitmapUtil.isNthMsbSet(b, ix)) {
if (n == 0) {
return ix;
} else {
n--;
}
}
ix++;
}
return -1;
}
}
我已经看到了很多聪明的小技巧,我不禁觉得应该有更好的方法。有没有?
I'm using some long values as bitmaps in a Java program. Here's my method so far:
public class BitmapUtil
{
private static final long _B_MASK_LEFT_ON = 0x8000000000000000L;
public static long setNthMsb(int n)
{
return BitmapUtil._B_MASK_LEFT_ON >>> n;
}
public static boolean isNthMsbSet(long b, int n)
{
return (b & (BitmapUtil.setNthMsb(n))) != 0L;
}
public static int getNthMsbPosition(long b, int n)
{
int ix = 0;
while (ix < 64 && n >= 0) {
if (BitmapUtil.isNthMsbSet(b, ix)) {
if (n == 0) {
return ix;
} else {
n--;
}
}
ix++;
}
return -1;
}
}
I've seen so many clever bit tricks that I can't help but feeling that there should be a better way. Is there?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我认为这就是你想要的,没有关于这一切效率的线索。
这似乎是从左开始计数,其中 MSB 是位置 1,LSB 是位置 64。如果 i==65,则 n 位未设置。
I think this is what you want, no clues about efficiency of it all.
This seems to count from the left, where the MSB is position 1 and LSB is position 64. If i==65, then n bits were not set.
这里有一些不同的快速算法:bit hacks,寻找计算日志2 的数量。
最漂亮的是这个,但它只适用于 32 位数字:
Here is a couple of different fast algorithms: bit hacks, look for calculating the log 2 of the number.
The most beautiful is this one, but it only works for 32 bit numbers:
我在 32 位的 C++ 中找到了这个,它可以很容易地适应 Java 和 Java。 64 位
http://lsjandysf.spaces.live.com/blog/ cns!54FF19028BDE00EA!440.entry
I've found this in C++ for 32 bits, which could be easily adapted to Java & 64 bits
http://lsjandysf.spaces.live.com/blog/cns!54FF19028BDE00EA!440.entry