首页 > 解决方案 > 如何设置/获取 UInt64 的位?

问题描述

我正在使用 aUInt64来存储位。一个例子是UInt64 val = 0b0001_0000。现在我希望能够确定是否设置了特定位置的位。例如,我想知道第 4 位(使用从零开始的索引)是否设置在val. 如果我对此进行硬编码,我可以使用 AND 和 OR 运算符对临时变量进行操作,清除除第 4 位以外的所有位并检查值。但是,我想实现一种更动态的方式来做到这一点,所以我不需要使用一堆不同的位文字0b0001_0000来检查一下。

我尝试解析"0b0001_0000"动态创建的字符串,但我对 , 等没有UInt64运气Byte

标签: c#binary

解决方案


使用位移运算符将索引转换为无符号长整数:

ulong bitIndexValue = 1ul << index;
//    bitIndexValue = 0b0001                       if index equals 0
//    bitIndexValue = 0b0010                       if index equals 1
//    bitIndexValue = 0b0100                       if index equals 2

检查您的 unsigned long 是否将相同的位设置为 1:

   ( 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

推荐阅读