翻译和解释一些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'和' 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使用了一个特殊规则,因为这个公式会溢出。
相关文章:
- 对字符串进行位操作
- 对字符数组中的元素执行逐位操作
- 逐位操作的隐式类型转换
- 如何进行特定的位操作?
- C++避免位操作完全移位
- 使用双包装器类进行位操作(C++、clang)修复性能下降问题
- 使用位操作优化检查
- 子集相关位操作
- 使用 c++ 提升库的按位操作
- 位操作和异或
- 位操作将最左侧的设置位转换为右侧交替位?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- POD 类型的原子按位操作
- 如何使用位操作在单个整数中编码和解码两个数字
- __int128的位操作
- 使用位操作会影响内存消耗?
- 在具有位操作的函数中获得值
- C/C 位操作不会导致预期输出
- 在数组大小中使用位操作的原因
- 了解C++位操作中的二进制转换实现