翻译和解释一些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#中移位操作的count部分应该始终是int类型。所以试着把长度和位置变成int而不是int。看到这里。
作为一个示例来解释代码(为了简单起见,使用8位),我们说aValue = 01101001
, aData = 00100110
, aPosition = 3
和aLength = 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;
现在将aData
的aLength
(4)位拷贝到aValue
: aValue = 00000001 | 00110000 = 00110001
中的aPosition
(3)位。
那么这个函数的作用是,将aValue
中aPosition
位的aLength
位替换为aData
中最右边的aLength
位。
我不明白这里发生了什么:
datamask = (1L << aLength) - 1;
这段代码创建了一个掩码,第一个(最右边的)aLength
位设置为1。代码对length =32使用了一个特殊规则,因为这个公式会溢出。