控制 ushort 数组中的位
Controlling bits in a ushort array
我想知道如何有效地读取和写入特定位到 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 class 但它只需要一个字节或 32 位整数。
有人知道怎么做吗?
谢谢
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;
要在方法中执行此操作,您可以使用方法 return 或通过引用传递 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
首先,您需要通过确保 bitNumber
值介于 1 和 16 之间来防止无效 bitNumber
值。
然后,如果 state
为真,则您想要 "OR" 使用将该位设置为 1 的掩码(通过左移 1 到所需位置)来进行设置。否则你 "AND" 它有一个掩码,其中所有位都是 1,除了你想设置为零的位(通过 NOT-ing 另一个掩码来实现)。
为了确定该位是否已设置 "AND" 将其设置为提到的第一个掩码并与零进行比较。
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,或者从零开始减去 15。
我真的很喜欢(它看起来更干净并且创建的变量更少),但它不对。最后一次检查应该是 (> 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;
}
我想知道如何有效地读取和写入特定位到 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 class 但它只需要一个字节或 32 位整数。
有人知道怎么做吗?
谢谢
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;
要在方法中执行此操作,您可以使用方法 return 或通过引用传递 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
首先,您需要通过确保 bitNumber
值介于 1 和 16 之间来防止无效 bitNumber
值。
然后,如果 state
为真,则您想要 "OR" 使用将该位设置为 1 的掩码(通过左移 1 到所需位置)来进行设置。否则你 "AND" 它有一个掩码,其中所有位都是 1,除了你想设置为零的位(通过 NOT-ing 另一个掩码来实现)。
为了确定该位是否已设置 "AND" 将其设置为提到的第一个掩码并与零进行比较。
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,或者从零开始减去 15。
我真的很喜欢> 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;
}