如何在C#中有效地设置/获取位模式

时间:2014-06-30 07:59:12

标签: c# bit-manipulation bits

通常在使用硬件接口时,您必须设置位组或设置它们而不更改其余位。界面描述说: 你得到一个System.UINT32,如果可用则设置位0;位1..7表示最小值;位8..14是最大值;位15..17是阈值等 我必须为很多值执行此操作,每个值都有自己的开始和停止位。

这就是为什么我想创建一个可以将值(起始位;停止位;原始UINT32值)转换为它所代表的值的类,然后返回。

类似于:

class RawParameterInterpreter
{
    public int StartBit {get; set;}    // counting from 0..31
    public int StopBit {get; set;}     // counting from 0..31

    Uint32 ExtractParameterValue(Uint32 rawValue);
    Uint32 InsertParameterValueToRawValue(Uint32 parameterValue,
        Uint32 rawValue);
}

我理解处理位的部分:

// example bits 4..7:
extract parameter from raw value: (rawvalue & 0x000000F0) >> startbit;
insert parameter into raw: (parameter << startbit) | (rawValue & 0xFFFFFF0F)

问题是,如何从值startBit和endBit初始化0x000000F0和0xFFFFFF0F?有没有一种通用的方法来计算这些值?

我会用这样的东西

Uint32 bitPattern = 0;
for (int bitNr = startBit; bitNr <= stopBit; ++bitNr)
{
    bitPattern = bitPattern << 2 + 1;
}
bitPattern = bitPattern << startBit;

我知道System.Collections.BitArray类。这样可以更容易设置位,但是如何将BitArray转换回Uint32?

所以问题:对此最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

嗯,你的问题非常笼统,但是,

您可以使用enum with a Flags属性。

[Flags]
public enum BitPattern
{
    Start = 1,
    Stop = 1 << 31
}