繁体   English   中英

Java或C中的按位运算

[英]Bitwise operation in java or c

我想极大地改善我最好将其描述为一个明智的操作的时间性能。 下面是一个BitFile类的构造函数,将三个BitFile作为参数。 取其位在第一和第二参数( firstContendersecondContender )议定取自firstContenderBitFile被构建。 他们不同意的任何内容都来自supportContender

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

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

add(byte,int)取一个代表一个位的字节,并提取该位内的索引,使用第二个类字段“ index”,并在add(byte,int)递增以将下一位放置在位置。

'BitFile.get(int)'返回一个字节,其中一个特定位为1,如果为1,则如果第二字节的第二位为1,则BitFile.get(9)将返回一个值为2的字节。 0。

Xor按位操作可以快速告诉我两个BitFile中的哪些位不同。 有没有使用异或,所有它的零被代表的结果,任何快捷方式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);
        }
    }
}

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

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数组很容易完成同一件事,这将需要较少的操作来处理相同数量的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM