C#位移位和按位运算

时间:2018-08-02 16:43:55

标签: c# bit-manipulation bit-shift

我正在寻找解决以下问题的更快方法。

我有2个表示位的整数数组,这里是一个8位的例子

int[] intArray1 = new[] {1, 1, 1, 0, 1, 1, 0, 1};
int[] intArray2 = new[] {0, 1, 0, 0, 1, 0, 0, 1};

数组中的位数可以是8、32、64和64 +

因此,我应该能够创建一种处理任何类型输入,对每个输入进行移位并以尽可能快的方式在两个数组之间应用逻辑运算的算法。

经过一些研究,我考虑将int数组转换为bool数组并使用bool数组创建 BitArray ,因为 BitArray 具有支持bools作为位,它具有内置的按位操作。

bool[] boolArray = intArray.Select(s => s.Equals(1)).ToArray();
BitArray bitArray = new BitArray(boolArray);

但是它不支持内置的位移位,它需要进行迭代,失去了我试图达到的整个性能点。

我可以使用int32和int64,但该解决方案不适用于大于64位的大小。

亲切问候

1 个答案:

答案 0 :(得分:1)

为什么不只使用BigInteger

您可以使用此方法将string转换为BigInteger

public static BigInteger BinToDec(string value)
{
    // BigInteger can be found in the System.Numerics dll
    BigInteger res = 0;

    // I'm totally skipping error handling here
    foreach(char c in value)
    {
        res <<= 1;
        res += c == '1' ? 1 : 0;
    }

    return res;
}

或者如果您想坚持使用int数组并将其转换为BigInteger

public static BigInteger BitArrayToBigDecimal(int[] bitIntArr) {
    // BigInteger can be found in the System.Numerics dll
    BigInteger res = 0;

    // I'm totally skipping error handling here
    foreach(int i in bitIntArr) {
        res <<= 1;
        res += i == 1 ? 1 : 0;
    }
    return res;
}

您也可以将其移位。像这样:

var foo = BinToDec("11101101");

BigInteger fooShifted = foo >> 4;

var bar = BitArrayToBigDecimal(new[] {1, 1, 1, 0, 1, 1, 0, 1});

BigInteger barShifted = bar >> 4;

如果您有任何疑问,请告诉我。