java或c中的按位运算

巴尼

我想大幅提高一个操作的时间性能,我最好将其描述为有点明智的操作。下面是一个BitFile的构造函数,以三个BitFile为参数。取其位在第一和第二参数(firstContendersecondContender)同意取自firstContenderBitFile被构造。他们不同意的任何一点都取自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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java中的按位运算

来自分类Dev

C ++中的联合和按位运算

来自分类Dev

C解释中的按位运算

来自分类Dev

c中的可变按位运算

来自分类Dev

C中的按位异或运算

来自分类Dev

在Java中对128位进行按位运算

来自分类Dev

在Java中对128位进行按位运算

来自分类Dev

如何在C中按位运算存储移位的位?

来自分类Dev

APL中的按位运算?

来自分类Dev

Group By中的按位运算

来自分类Dev

C ++按位运算反向

来自分类Dev

C / C ++中的编译时按位运算

来自分类Dev

Java中的按位右移运算符

来自分类Dev

Java中的按位和运算符

来自分类Dev

Java中按位运算符的屏蔽选项

来自分类Dev

在Java中执行按位或运算而无需符号扩展

来自分类Dev

C中无符号long long的按位运算

来自分类Dev

c中按位OR运算符的结果

来自分类Dev

具有按位运算符的C ++中的算法

来自分类Dev

C中的按位运算符和移位问题

来自分类Dev

C ++中的位运算

来自分类Dev

按位运算的结果是否取决于Java的固有性?在C或C ++中呢?

来自分类Dev

按位运算的结果是否取决于Java的固有性?在C或C ++中呢?

来自分类Dev

无法在Java中按位进行或运算(双精度)或在JavaScript中进行(双精度)运算

来自分类Dev

使用C中的按位运算进行2位映射

来自分类Dev

如何使用按位运算符和位操作在C中交换2个整数?

来自分类Dev

Java | 按位运算符

来自分类Dev

hashCode中按位运算符>>>

来自分类Dev

JavaScript中按位运算的效率