我想极大地改善我最好描述为位操作的操作的时间性能。
以下是BitFile
类的构造函数,以三个BitFile
作为参数。第一个参数和第二个参数(firstContender
和secondContender
)一致的任何一位都将从firstContender
引入到正在构建的BitFile
中。他们不同意的任何内容都来自supportContender
。
data
是存储结果和BitFile
类主干的类字段。
compare(byte,byte)
如果两个字节的值相同,则返回true。
{add(byte,int)
代表一个字节,并提取该比特内的索引,使用第二个类字段“索引”,并在add(byte,int)
中递增以将下一位放置在位置。 / p>
'BitFile.get(int)'返回一个字节,其中一个特定位为1,如果为1,则如果第二个字节的第二位为a,则BitFile.get(9)将返回一个值为2的字节。 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);
}
}
}
答案 0 :(得分: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的位。模式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));
}
使用int
或long
数组很容易完成相同的事情,只需较少的操作即可处理相同数量的数据。