繁体   English   中英

将一些C ++位操作转换并解释为C#

[英]Translate and explain some C++ bit operations to C#

你能帮我翻译一下这个第三方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'和'uint'类型的操作数

错误运算符'<<'不能应用于'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#中移位操作的计数部分应始终为int。 因此,尝试将aLength和aPosition转换为int而不是uint。 看这里。

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

此代码创建一个掩码,其中第一个(最右侧) aLength位设置为1.代码对aLength = 32使用特殊规则,因为此公式将溢出。

作为解释代码的例子(在8位中,为了简单起见),假设aValue = 01101001aData = 00100110aPosition = 3aLength = 4

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

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

aValue &= ~(datamask << aPosition);

清除aPosition th(3rd)位的aLength (4)位: aValue = 01101001 & 10000111 = 00000001

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

现在复制aLength (4)的最右边的位aDataaPosition个中(第3次)比特位置aValueaValue = 00000001 | 00110000 = 00110001 aValue = 00000001 | 00110000 = 00110001

所以这个函数做什么,是更换aLength在位aPosition日在位的位置aValueaLength在最右边的位aData

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM