我想知道如何有效地将特定位数读写到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位整数。
有人知道怎么做吗?
谢谢
发布于 2015-03-27 13:00:40
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
发布于 2015-03-27 13:22:27
首先,您需要通过确保bitNumber值介于1到16之间来防范无效的and值。
然后,如果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为基础,或以零为基础减去15。
发布于 2019-01-23 18:46:57
我真的很喜欢juharr's answer (它看起来更干净,创建的变量更少),但是它不正确。最后一次检查应该是(> 0) not (> 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;
}https://stackoverflow.com/questions/29300801
复制相似问题