我可以在Java中创建没有条件的1到64位位位掩码吗?

我可以在Java中创建没有条件的1到64位位位掩码吗?,java,bitmask,Java,Bitmask,我想写一个函数,它接受1到64之间的整数,并返回一个适当的“位掩码”,输入的位数为1位 我是这样开始的: /** Computes a bitmaks */ private static long mask(final int bitsPerValue) { return (1L << bitsPerValue) - 1L; } /**计算bitmaks*/ 专用静态长掩码(最终整数位右值){ return(1L这里有一种不带条件的方法: private static lo

我想写一个函数,它接受1到64之间的整数,并返回一个适当的“位掩码”,输入的位数为1位

我是这样开始的:

/** Computes a bitmaks */
private static long mask(final int bitsPerValue) {
    return (1L << bitsPerValue) - 1L;
}
/**计算bitmaks*/
专用静态长掩码(最终整数位右值){

return(1L这里有一种不带条件的方法:

private static long mask(final int bitsPerValue) {
    return ((1L << bitsPerValue) - (bitsPerValue >> 6)) - 1L;
}
现在,如果你真的要称之为“每秒无数次”,我认为最好的策略是处理所有代码变体,包括带有条件的变体和带有查找表的变体。

我尝试过:

long value = 0xffffffffffffffffl >>> (64 - i); // that's ef ef ef... el.
但这似乎给i=0带来了一个问题。我对Java没有无符号整数的抱怨再次出现。上面的方法在c中有效。考虑到“value”是无符号的,可能上面的方法在Java 7中也有效


但是,由于您不需要零,上述操作对您来说很好,即值1到64。

IMHO,添加65位值的要求是不够的。我只需要使用或操作来生成值,应该不会花费很多时间。如下所示:

private static long mask(final int bitsPerValue) {
  long mask = 1;
  long value = 0;
  for (int i=0; i<bitsPerValue; i++ ) {
    value = value | mask;
    mask = mask << 1;
  }
  return value;
}
专用静态长掩码(最终int位右值){
长面罩=1;
长值=0;

对于(int i=0;我已经分析过了吗?如果你只是让它在没有条件和不正确的结果的情况下运行,与有条件和正确的结果运行相比,你真的看到了任何显著的差异吗?这是针对基于位板的象棋引擎吗?:-)@ziesemer-我打赌他看不到任何差异(事实上,如果经常需要64,它甚至可能更快)。问题是,人们如此痴迷于性能,却不知道JIT和CPU是如何工作的……他们只是认为运行时将与java表达式大小(以字符为单位)成正比……我不认为上面的内容是关于if语句耗时太长的问题。这是关于优雅的问题。您必须同意,下面的aix解决方案比上面的要优雅得多这需要明确检查特殊情况。我确信这也是塞巴斯蒂安的推理。@ziesemer还没有,因为我还没有可用的测试数据。但是,即使JVM以某种方式对其进行了优化,我仍然认为它很难看。哇!非常有信息量的答案。但是@Jaco似乎有一个更简单的版本,更容易理解。0没有任何问题在我的例子中是se。深度为0位的数据类型根本不是数据,甚至不是0和1。您的版本简单易懂。谢谢!
(1L - 1L) - 1L == -1L
long value = 0xffffffffffffffffl >>> (64 - i); // that's ef ef ef... el.
private static long mask(final int bitsPerValue) {
  long mask = 1;
  long value = 0;
  for (int i=0; i<bitsPerValue; i++ ) {
    value = value | mask;
    mask = mask << 1;
  }
  return value;
}
long valarray[] = new long[64];

private static long[] generateValues() {
  long mask = 1;
  long value = 0;
  for (int i=0; i<64; i++ ) {
    value = value | mask;
    mask = mask << 1;

    valarray[i] = value;
  }
  return valarray;
}

private static long[] mask(final int bitsPerValue) {
  return valarray[bitsPerValue-1];
}