使用BitArray将C ++算法重写为C#

时间:2016-06-17 12:48:30

标签: c# operators bitarray

我在C

中有以下代码
        std::bitset < 80 > license;
        for (i = 3; i >= 0; i--)
        {
            for (j = 0; j < 32; j++)
            {
                if (CDKeyCopy[i] == TranslateTable[0][j])
                {
                    license <<= 5;
                    license |= j;
                    break;
                }
            }
            if (j == 32) //not found in TranslateTable
                return BADCDKEYCHAR;
        }

我想在C#中执行以下操作

            BitArray license = new BitArray(80);
            for (i = 15; i >= 4; i--)
            {
                for (j = 0; j < 32; j++)
                {
                    if (licValue[i] == year[j])
                    {
                        license <<= 5;
                        license |= j;
                        break;
                    }
                }

                //not found in TranslateTable
                if (j == 32)
                {
                    return LicenseInfos.BADCDKEYCHAR;
                }
            }

我收到以下错误 错误CS0019:运算符'&lt;&lt; ='不能应用于'BitArray'和'int'类型的操作数 我希望能够将值移到左边并设置它,就像在c ++中一样。我在网上搜索了几个小时而没有任何运气,任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

你不能像位数组那样使用位移运算符 bitarray并不完全取代bitset

这里有一些信息 What is the C# equivalent of std::bitset of C++

BitArray - Shift bits

答案 1 :(得分:0)

C#中的BitArray没有实现移位运算符。有关可能的实施,请参阅Shifting a BitArray

为什么不利用.Net的一些功能呢?

而不是直接端口

e.g。 (没有测试并对一些变量的目的进行疯狂的猜测,但给出了一般的想法):

var licValue = new List<int> { ... };
var years = new List<int> { ... }; // 32 years listed
int lic = 0;

...

if (licValue.Any(y => !years.Contains(y))) return LicenseInfos.BADCDKEYCHAR;

for (i = 15; i >= 4; i--)
{
    // lic <<= 5 then license |= index of year array 
    lic *= 32 + years.IndexOf(years.Where(y => licValue[i] == y).First());
}

// convert int to BitArray
var licenseArray = new BitArray(lic.PadLeft(80, '0')
    .ToCharArray().Select(b => b == '1' ? true : false).ToArray());