【问题标题】:Bitwise operation in java or cjava或c中的按位运算
【发布时间】:2018-07-05 07:46:02
【问题描述】:

我想大幅提高操作的时间性能,我最好将其描述为有点明智的操作。 下面是一个BitFile类的构造函数,以三个BitFile为参数。无论第一个参数和第二个参数(firstContendersecondContender)同意哪个位,都取自 firstContender 到正在构造的 BitFile。他们不同意的任何一点都来自supportContender

data 是存储结果的类字段和BitFile 类的主干。

compare(byte,byte) 如果两个字节的值相同,则返回 true。

add(byte,int) 采用一个表示位的字节和要提取的位内的索引,使用第二个类字段“索引”并在 add(byte,int) 中递增以放置下一个位。

'BitFile.get(int)' 返回一个只有特定位为 1 的字节,如果是 1,如果第二个字节的第二位是1,否则为 0。

异或位运算可以快速告诉我两个BitFile 中哪些位不同。是否有任何快速的方法来使用 Xor 的结果,其中所有的零都由firstContender 的等效位表示,所有的零都由supportContender 的等效位表示,类似于 三操作数按位运算符?

public BitFile(
BitFile firstContender,BitFile secondContender,BitFile supportContender)
{
    if(firstContender.getLength() != secondContender.getLength())
    {
        throw new IllegalArgumentException(
        "Error.\n"+
        "In BitFile constructor.\n"+
        "Two BitFiles must have identical lengths.");
    }
    BitFile randomSet = supportContender;
    int length = firstContender.getLength();
    data = new byte[length];
    for(int i = 0; i < length*8;i++)
    {
        if(compare(firstContender.get(i),secondContender.get(i)))
        {
            add(firstContender.get(i),i%8);
        }
        else
        {
            add(randomSet.get(i),i%8);
        }
    }
}

【问题讨论】:

  • 对于大型集合的按位运算,我建议使用BitSet,每个值使用 1 位,速度更快也更小。

标签: java bitwise-operators


【解决方案1】:

我发现这个问题相当令人困惑,但我认为您正在计算的内容是这样的:

merge(first, second, support) = if first == second then first else support

所以只需根据第一个和第二个来源是否同意来选择位的来源。

类似于三操作数位智运算符?

确实是这样的。但是当然我们需要手动实现Java支持的操作。按位算术有两种常见的模式,可以根据第三个来源在两个来源之间进行选择:

1) (a & ~m) | (b & m)
2) a ^ ((a ^ b) & m)

对于每个位,从a 中选择位,其中m 为零,从b 中选择m 为一。模式 1 更容易理解,所以我将使用它,但将代码调整为第二种模式很简单。

如你所料,本例中的掩码将是first ^ second,所以:

for (int i = 0; i < data.length; i++) {
    int m = first.data[i] ^ second.data[i];
    data[i] = (byte)((first.data[i] & ~m) | (support.data[i] & m));
}

同样的事情可以通过intlong 的数组轻松完成,这将需要更少的操作来处理相同数量的数据。

【讨论】:

  • 当然!现有的按位运算符的组合不是我想到的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多