【发布时间】:2009-09-30 07:35:12
【问题描述】:
我在 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;
}
}
我见过这么多聪明的小把戏,我不禁觉得应该有更好的方法。有吗?
【问题讨论】:
-
“ixNthMsbSetPos”? “fIsNthMsbSet”? ......当我呕吐时请原谅我:-)
-
@Stephen C - 好吧,我已经习惯了我们的匈牙利语,以至于我认为方法名称没有任何问题。也许现在对眼睛更友好了? ;-)
-
这不仅仅是匈牙利语,而是难以理解的命名。为什么不使用像
boolean isSet(long number, int bitIndex)这样的签名。很明显,这样的方法会返回number中的bitIndex'th 位是否已设置,不是吗? -
@Joren - 感谢您的反馈,非常感谢!但是,很多可读或不可读与您习惯的内容以及您在什么环境中找到内容有关。例如,在处理位模式时,我经常会遇到“我是从左数还是从右数?”这个问题,所以这将是我在
isSet(... bitIndex)中遗漏的一些内容。 OTOH,一直使用匈牙利语,ix(b, n)的签名已经告诉我基本操作,因为我知道如果我将b和n变成ix会发生什么。这很像方言:瑞士人说不可能的德语,但他们都听得懂。 -
@Joren - 是的,我知道。 :) 但我试图更笼统一点。它必须是理解代码的组 人员。例如,一个西班牙团队可能会选择将所有内容命名为西班牙语,除非有人必须理解非母语人士的代码,否则这不会有任何问题。我想这是非常罕见的,但就像没有通用的自然语言一样,也没有天生就比所有其他语言更好的命名约定。那么,像您这样的反馈对于判断您的本地方言的具体程度非常重要。
标签: java bitmap bit-manipulation