首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ushort数组中控制位

在ushort数组中控制位
EN

Stack Overflow用户
提问于 2015-03-27 12:34:36
回答 3查看 1.2K关注 0票数 1

我想知道如何有效地将特定位数读写到ushort整数。

这些方法如下所示:

代码语言:javascript
复制
// 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位整数。

有人知道怎么做吗?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-27 13:00:40

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-03-27 13:22:27

首先,您需要通过确保bitNumber值介于1到16之间来防范无效的and值。

然后,如果state为真,则设置为“或”的掩码设置为1(向左移动1到所需的位置)。否则,您“和”它与一个掩码,其中所有的位是1,除了一个你想要设置为零(通过没有完成另一个掩码)。

用于确定是否将位设置为“和”,并将其设置为所述的第一个掩码,并将其比较为零。

代码语言:javascript
复制
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为基础,或以零为基础减去15。

票数 3
EN

Stack Overflow用户

发布于 2019-01-23 18:46:57

我真的很喜欢juharr's answer (它看起来更干净,创建的变量更少),但是它不正确。最后一次检查应该是(> 0) not (> 1)。

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29300801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档