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

3
很多时候,在使用硬件接口时,您需要设置一组位或在不更改其余位的情况下设置它们。接口说明如下: 您会得到一个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呢?
问题是:什么是最好的方法?

坦率地说,我只会坚持使用 & / | / ~ / >> / <<;任何类似于 BitArray 的东西都是不必要的开销。 - Marc Gravell
1
这完全取决于你想做什么。 - Jodrell
人们似乎使用CopyTo...你读过http://stackoverflow.com/questions/9697623/bitarray-to-integer-issue吗?或者https://dev59.com/cW435IYBdhLWcg3wrSBB? - Paul Zahra
^ 这是如果你想在没有常量的情况下完成它。尽管如此,使用常量会更好。 - harold
1个回答

2

你的问题非常泛泛,但是,

你可以使用带有 Flags 属性的 enum

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接