我想大幅提高一个操作的时间性能,我最好将其描述为有点明智的操作。下面是一个BitFile
类的构造函数,以三个BitFile
为参数。取其位在第一和第二参数(firstContender
和secondContender
)同意取自firstContender
到BitFile
被构造。他们不同意的任何一点都取自supportContender
.
data
是存储结果的类字段和BitFile
类的主干。
compare(byte,byte)
如果两个字节的值相同,则返回 true。
add(byte,int)
需要一个代表一个位的字节和要提取的位中的索引,使用第二个类字段“索引”并递增add(byte,int)
以将下一位放入位置。
'BitFile.get(int)' 返回一个字节,只有一个特定的位是 1,如果它是 1,如果第二个字节的第二位是 1,BitFile.get(9) 将返回一个值为 2 的字节,否则0.
Xor 按位运算可以快速告诉我两者中哪些位不同BitFile
。有没有什么快速的方法可以使用 Xor 的结果,其中所有的零都由firstContender
's 的等效位表示,所有的零都由's 的等效位表示supportContender
,类似于三操作数的 Bit Wise 运算符?
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);
}
}
}
我发现这个问题相当令人困惑,但我认为你正在计算的是这样的:
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));
}
同样的事情可以很容易地用一个数组来完成,int
或者long
需要更少的操作来处理相同数量的数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句