c# - 控制 ushort 数组中的位

标签 c# bit

我想知道如何有效地读取和写入特定位到 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 位整数。

有人知道怎么做吗?

谢谢

最佳答案

首先,您需要通过确保 bitNumber 值介于 1 和 16 之间来防止无效。

如果 state 为真,那么对于设置,您要么想用将该位设置为 1 的掩码“或”它(通过左移 1 到所需位置)。否则你用一个掩码“与”它,其中所有位都是 1 除了你想设置为零的那个(通过 NOT-ing 另一个掩码来实现)。

要确定该位是否已设置,只需将其与提到的第一个掩码进行“与”比较,然后与零进行比较。

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 从最低有效位或最右边的位开始以一为基础。如果您想要从零开始,只需删除所有代码中 bitNumber 之后使用的 - 1 并相应地调整 if 语句。要使其从最高有效位或最左边的位开始,只需从 bitNumber 中减去 16,而不是从 1 开始减去 1,或者从 0 开始减去 15。

关于c# - 控制 ushort 数组中的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29300801/

相关文章:

c# - 使用 new() 或 default 初始化变量之间的区别?

c# - 为什么 C# split 给我一个以空行结尾的数组?

c# - ILNumerics轴配置

ios - UInt8如何分为3位和5位

c - 如何从变量访问特定的一组位?

c# - Raycast 和 Instantiate 的区别

c# - 我正在尝试通过 C# 调用操作结果方法

java - 获取某个位的位置以及是否已设置

c - 右移按位与

c++ - 在 n LSBits 之后清除 m 位的掩码