创建Bit / Byte数组算术类的最佳方法

时间:2014-03-21 19:00:17

标签: arrays math byte bit biginteger

我目前正在使用非常大的数字,我想用它们做简单的计算,但我有问题。当我从字节数组创建数字时,甚至c#BigInteger超时。

bytearrays真的非常大,比如每个多达几MB。

所以我认为我可以创建一个“字节数组计算器”,它需要2个数组并添加/减去它们。

bit[] result = BitArrCalculator.Add(arrA, arrB)
// arrA is 1001 (9)
// arrB is 11 (3)
// then result should be 1100 (12)

因为我有非常大的数字,所以我无法将它们转换为整数并再次转换回来。至少不在c#中。如果有其他语言可以做到这一点,我可以改变语言,但我想有一个可以处理任意数组大小的解决方案。

这感觉应该存在一个解决方案/库/框架,但我还没有找到它。

所以我的问题: 使用位/字节数组并对它们进行加法/减法的最佳方法是什么?是否有任何工具/库?

2 个答案:

答案 0 :(得分:0)

未测试。

byte[] Add( byte[] one, byte[] two )
{
    byte[] ret = new byte[ Math.Max( one.Length, two.Length ) ];
    int carry = 0;
    for( int i = 0; i < one.Length && i < two.length; ++i )
    {
        int total = (int)one[i] + two[i] + carry;
        if( total > 255 )
        {
            carry = total - 255;
            total = total - carry;
        }
        ret[i] = (byte) total;
    }

    // at most one of these for loops will execute

    for( int j = i; j < one.Length; ++j )
    {
        int total = carry + one[j];
        if( total > 255 )
        {
            carry = total - 255;
            total = total - carry;
        }
        ret[j] = (byte) total;
    }

    for( int j = i; j < two.Length; ++j )
    {
        int total = carry + two[j];
        if( total > 255 )
        {
            carry = total - 255;
            total = total - carry;
        }
        ret[j] = (byte) total;
    }

    if( carry > 0 ) { /* have to add another byte to the array */ }

    return ret;
}

答案 1 :(得分:0)

我决定编写自己的类,可以使用两个给定的位数组进行加法和减法。对我来说,在我的项目中,使用位而不是字节更有意义。使用位进行加法和减法的逻辑非常简单。