翻译和解释一些c++位操作到c#

本文关键字:位操作 c++ 解释 翻译 | 更新日期: 2023-09-27 18:11:01

你能帮我把这个第三部分API方法翻译成c#吗?

我也不明白在位操作中发生的一切。

inline void SetBits(unsigned long& aValue,unsigned int aData,unsigned int aPosition,unsigned int aLength)
{
    unsigned int datamask;   // data mask, before aPosition shift
    if (aLength == 32)
        datamask = 0xFFFFFFFF;
    else
        datamask = (1L << aLength) - 1;
    aValue &= ~(datamask << aPosition);             // Clear bits
    aValue |= (aData & datamask) << aPosition;      // Set value
}

我在c#版本中得到这个错误:

错误操作符'<<'不能应用于'long'和' int'类型的操作数

错误操作符'<<'不能应用于'uint'和'uint'类型的操作数

编辑:

我认为这个解决方案是可以的:

    private void SetBits(ref uint value, uint data, int position, int length)
    {
        uint datamask;   // data mask, before position shift
        if (length >= 32)
            datamask = 0xFFFFFFFF;
        else
            datamask = ((uint)1 << length) - 1;
        value &= ~(datamask << position);             // Clear bits
        value |= (data & datamask) << position;      // Set value
    }

翻译和解释一些c++位操作到c#

c#中移位操作的count部分应该始终是int类型。所以试着把长度和位置变成int而不是int。看到这里。

作为一个示例来解释代码(为了简单起见,使用8位),我们说aValue = 01101001, aData = 00100110, aPosition = 3aLength = 4:

datamask = (1L << aLength) - 1;

创建一个掩码,aLength(4)最右边的位设置为1:datamask = 00001111

aValue &= ~(datamask << aPosition);

清除aPosition第(3)位位置的aLength(4)位:aValue = 01101001 & 10000111 = 00000001 .

aValue |= (aData & datamask) << aPosition;

现在将aDataaLength(4)位拷贝到aValue: aValue = 00000001 | 00110000 = 00110001中的aPosition(3)位。

那么这个函数的作用是,将aValueaPosition位的aLength位替换为aData中最右边的aLength位。

我不明白这里发生了什么:datamask = (1L << aLength) - 1;

这段代码创建了一个掩码,第一个(最右边的)aLength位设置为1。代码对length =32使用了一个特殊规则,因为这个公式会溢出。