c# - 在字节数组中设置特定位

标签 c# arrays bit-shift

我想知道如何设置 16 字节数组(128 位)中的特定位。

例如...如果我想设置数组中的第 9 位,我会期望:

{00, 80, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00}

如果我想设置第125位...

{00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 08}

我研究过位移位的使用,但对如何对由 128 位组成的数组进行位移位感到困惑。有没有办法分解这个大小的数组并以更小的字节 block 进行评估?任何帮助将不胜感激。

最佳答案

选择特定位的过程包括两个步骤:

  • 选择字节,然后
  • 选择位。

选择字节很简单:您需要做的就是将位索引除以字节中的位数 - 即除以八:

int byteIndex = bitIndex / 8;

既然您知道要使用哪个字节,那么请计算您要访问的位。为此,您需要计算除以 8 的余数,如下所示:

int bitInByteIndex = bitIndex % 8;

有了这两个索引,访问这个位就很容易了:使用1 << bitInByteIndex作为面具,像这样:

byte mask = (byte)(1 << bitInByteIndex);
bool isSet = (bytes[byteIndex] & mask) != 0;
// set to 1
bytes[byteIndex] |= mask;
// Set to zero
bytes[byteIndex] &= ~mask;
// Toggle
bytes[byteIndex] ^= mask;

关于c# - 在字节数组中设置特定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21408109/

相关文章:

c# - 何时使用包含引用类型的值类型数组而不是引用类型数组?

将原始加速度计值转换为 12 位数字

c++ - 替换 o/istream bool 位移运算符

c# - 为什么这个静态构造函数没有被调用?

c# - 创建类实例时关键字 "new"和 "default"不同

c# - 使用操作上下文跟踪相关事件的问题

c# - 在 C# 中使用枚举索引数组

ruby-on-rails - ruby数组奇怪的东西(无限数组)

c++ - C/C++ vector 到 Numpy 数组的快速转换

c++ - 仅使用位掩码确定偏移量