您能帮我将此第三部分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#版本中遇到此错误:

编辑:
我认为这种解决方案是可以的:
    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
    }

最佳答案

作为说明代码的示例(为简单起见,以8位为例),让我们说aValue = 01101001aData = 00100110aPosition = 3aLength = 4:

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

创建一个掩码,将最右边的aLength(4)位设置为一个:datamask = 00001111
aValue &= ~(datamask << aPosition);

清除位于aLength th(3rd)位的aPosition(4)位:aValue = 01101001 & 10000111 = 00000001
aValue |= (aData & datamask) << aPosition;

现在将aLength的最右边aData(4)位复制到aPosition:aValue中的aValue = 00000001 | 00110000 = 00110001 th(3rd)位位置。

因此,此功能的作用是用aLength中最右边的aPosition替换aValueaLength的第aData位的位置的ojit_code位。

09-28 14:19