![](/img/trans.png)
[英]Translating some bit operations from javascript to c# — if(int & #)
[英]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 = 01101001
, aData = 00100110
, aPosition = 3
和aLength = 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)的最右边的位aData
到aPosition
个中(第3次)比特位置aValue
: aValue = 00000001 | 00110000 = 00110001
aValue = 00000001 | 00110000 = 00110001
。
所以这个函数做什么,是更换aLength
在位aPosition
日在位的位置aValue
与aLength
在最右边的位aData
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.