控制ushort数组中的位

时间:2015-03-27 12:34:36

标签: c# bit bits

我想知道如何有效地读取和写入特定位到一个ushort整数。

方法就是这样:

// Sets the bit positioned at bitNumber in the ushort integer b
// to be either 1 or 0 depending on state.
public ushort SetBit(ushort b, int bitNumber, bool state)
{
   ushort result = b;
   // Code to set the specific bit in ushort result.
   return result
}
// Returns the value of the bit in position bitNumber from the 
// ushort b as a true or false.
public bool GetBit(ushort b, int bitNumber)
{
   bool stateOfBit = false;
   // Code to read the bit into stateOfBit.
   return stateOfBit;
}

我尝试过使用BitArray类,但它只需要一个字节或一个32位整数。

有人知道怎么做吗?

由于

3 个答案:

答案 0 :(得分:3)

首先,您需要确保它在1到16之间,以防止无效bitNumber值。

然后,如果state为真,则要设置为“或”将掩码设置为1(通过左移1到所需位置)。否则你用一个掩码“和”它,除了你想要设置为零的那个之外所有的位都是1(通过不用另一个掩码完成)。

用于确定该位是否仅设置为“与”,并将其设置为所提到的第一个掩码并与零进行比较。

public static ushort SetBit(ushort b, int bitNumber, bool state)
{
    if(bitNumber < 1 || bitNumber > 16)
        throw new ArgumentOutOfRangeException("bitNumber", "Must be 1 - 16");

    return state ? 
        (ushort)(b | (1 << (bitNumber - 1))) : 
        (ushort)(b & ~(1 << (bitNumber - 1)));
}

public static bool GetBit(ushort b, int bitNumber)
{
    if (bitNumber < 1 || bitNumber > 16)
        throw new ArgumentOutOfRangeException("bitNumber", "Must be 1 - 16");

    return (b & (1 << (bitNumber - 1))) > 1;
}

这假设您希望bitNumber与最低有效位或最右位相同。如果您想要从零开始,只需删除所有代码中- 1之后使用的bitNumber,并相应地调整if语句。要从最重要或最左边的位开始,只需从bitNumber减去16而不是从1减去1,或从零减去15。

答案 1 :(得分:2)

ushort s = 0;
//set the 5th bit from the right to true
s |= 1 << 5;
//set the 5th bit from the right to false
//~ will return a negative number, so casting to int is necessary
int i = s;
i &= ~(1 << 5);
s = (ushort)i;

要在方法中执行此操作,您可以让方法返回它或通过引用传递ushort:

public void SetBit(ref ushort b, int bitNumber, bool state) {
    if (bitNumber < 0 || bitNumber > 15)
        //throw an Exception or return
    if (state) {
        b |= (ushort)(1 << bitNumber);
    } else {
        int i = b;
        i &= ~(1 << bitNumber);
        b = (ushort)i;
    }
}

public bool GetBit(ushort b, int bitNumber) {
    if (bitNumber < 0 || bitNumber > 15)
        //throw an Exception or just return false
    return (b & (1 << bitNumber)) > 0;
}

要从左侧计算bitNumber,您需要15 - bitNumber

答案 2 :(得分:0)

我真的很喜欢juharr's answer(它看上去更干净,创建的变量也更少),但这是不对的。最后检查应该是(> 0,而不是(> 1)。

public static ushort SetBit(ushort b, int bitNumber, bool state)
{
    if(bitNumber < 1 || bitNumber > 16)
        throw new ArgumentOutOfRangeException("bitNumber", "Must be 1 - 16");

    return state ? 
        (ushort)(b | (1 << (bitNumber - 1))) : 
        (ushort)(b & ~(1 << (bitNumber - 1)));
}

public static bool GetBit(ushort b, int bitNumber)
{
    if (bitNumber < 1 || bitNumber > 16)
        throw new ArgumentOutOfRangeException("bitNumber", "Must be 1 - 16");

    return (b & (1 << (bitNumber - 1))) > 0;
}