您能帮我将此第三部分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 = 01101001
,aData = 00100110
,aPosition = 3
和aLength = 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
替换aValue
中aLength
的第aData
位的位置的ojit_code位。