C# 如何设置/获取UInt64的位?

C# 如何设置/获取UInt64的位?,c#,binary,C#,Binary,我正在使用UInt64存储位。例如,UInt64 val=0b001\u 0000。现在我想确定是否在特定位置设置了位。例如,我想知道是否在val中设置了第4位(使用基于零的索引)。如果我硬编码这个,我就可以使用AND和OR运算符对一个temp变量进行操作,清除除第4位之外的所有位并检查值。但是,我想实现一种更动态的方法来实现这一点,这样我就不需要使用像0b001\u 0000这样的一堆不同的位文本来检查位 我曾尝试解析动态创建的字符串,如“0b0001_0000”,但我对UInt64,字节,等

我正在使用
UInt64
存储位。例如,
UInt64 val=0b001\u 0000
。现在我想确定是否在特定位置设置了位。例如,我想知道是否在
val
中设置了第4位(使用基于零的索引)。如果我硬编码这个,我就可以使用AND和OR运算符对一个temp变量进行操作,清除除第4位之外的所有位并检查值。但是,我想实现一种更动态的方法来实现这一点,这样我就不需要使用像
0b001\u 0000
这样的一堆不同的位文本来检查位

我曾尝试解析动态创建的字符串,如
“0b0001_0000”
,但我对
UInt64
字节
,等等都没有什么好运气。

对于所有int、long、uint、ulong等,使用Left()操作符将位导航到更大的数值

请参阅有关MSDN文档的这篇文章:和

类似于此(我从左移位运算符页面中选取了示例):

class类main类
{
静态void Main()
{
int i=1;
长lg=1;
//向左移动一位,结果是2。

WriteLine(“0x{0:x}”,i使用位移位运算符将索引转换为无符号长字符串:

ulong bitIndexValue = 1ul << index;
//    bitIndexValue = 0b0001                       if index equals 0
//    bitIndexValue = 0b0010                       if index equals 1
//    bitIndexValue = 0b0100                       if index equals 2
以下是完整的方法:

static bool CheckBit(ulong value, byte index)
{
    if (index < 0 || index > 63) throw new ArgumentOutOfRangeException("index");
    ulong bitIndexValue = 1UL << index;
    return (value & bitIndexValue) == bitIndexValue;
}
Assert.IsTrue(CheckBit(4ul, 2));  // 0b0100    does contain        0b0100
Assert.IsTrue(CheckBit(5ul, 2));  // 0b0101    does contain        0b0100
Assert.IsFalse(CheckBit(8ul, 2)); // 0b1000    does not contain    0b0100

如果要检查是否设置了位,请使用
x&(1)或使用
BitArray
   ( value    & bitIndexValue) == bitIndexValue;
// ( 0b0101   &    0b0100    ) ==    0b0100        if index equals 2
static bool CheckBit(ulong value, byte index)
{
    if (index < 0 || index > 63) throw new ArgumentOutOfRangeException("index");
    ulong bitIndexValue = 1UL << index;
    return (value & bitIndexValue) == bitIndexValue;
}
Assert.IsTrue(CheckBit(4ul, 2));  // 0b0100    does contain        0b0100
Assert.IsTrue(CheckBit(5ul, 2));  // 0b0101    does contain        0b0100
Assert.IsFalse(CheckBit(8ul, 2)); // 0b1000    does not contain    0b0100