c# - 如何设置/获取 UInt64 的位?
问题描述
我正在使用 aUInt64
来存储位。一个例子是UInt64 val = 0b0001_0000
。现在我希望能够确定是否设置了特定位置的位。例如,我想知道第 4 位(使用从零开始的索引)是否设置在val
. 如果我对此进行硬编码,我可以使用 AND 和 OR 运算符对临时变量进行操作,清除除第 4 位以外的所有位并检查值。但是,我想实现一种更动态的方式来做到这一点,所以我不需要使用一堆不同的位文字0b0001_0000
来检查一下。
我尝试解析"0b0001_0000"
动态创建的字符串,但我对 , 等没有UInt64
运气Byte
。
解决方案
使用位移运算符将索引转换为无符号长整数:
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
推荐阅读
- javascript - 继承但不显示
- java - 如何打印填充有 1 和 0 的二维数组?
- c# - 某些文件出现“无法访问已关闭的文件”错误
- azure - Azure 虚拟机规模集和 Azure Batch 之间的区别
- node.js - 如何在没有 Dockerfile 的情况下设置 Docker Compose?
- c# - Xamarin Forms (Android) - 将应用与自定义文件类型相关联
- c++ - 如何从命令行向 C++ 程序输入字符串或整数?
- python - 如何在python中将列表存储在集合或字典中?
- python-3.x - 仅打印列表中的字典名称
- python - 仅当这些行彼此相邻时,如何删除重复项并保留第一行