首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据以下3个固定值计算位掩码和位移位值?

如何根据以下3个固定值计算位掩码和位移位值?
EN

Stack Overflow用户
提问于 2021-08-04 19:31:34
回答 1查看 113关注 0票数 0

我应该根据以下3个值来确定位掩码和移位值:起始字节、起始位和位数。

我将收到一些字节数组,用于我的x个字节的数据。假设这个大字节数组中的一些随机数据块表示灯开关是开还是关。因此,我将重点介绍本例中的单字节/8位数据。这8位中的3位用于确定灯开关的开/关状态。

因此,我所知道的关于这块数据的所有信息都是这3个固定值:这个字节数组中的起始字节位置,这个特定字节本身中的起始比特位置,以及为表示这个灯开关的开/关状态而分配的位数。

因此,在这个特定的示例中,字节位置是字节15 (在这个由x个字节组成的大型字节数组中)。起始位位置为0。位数为3(因为在该字节内分配了3位来表示开/关状态)。

我的问题是:如何根据这3个固定值计算位掩码和位移位值?我知道计算可能涉及基数2或2的幂,但不确定。

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2021-08-04 21:48:12

给定一个具有以下索引方案的字节数组...

代码语言:javascript
复制
byte ,--0---, ,--1---, ,--2---, ...
bit  76543210 76543210 76543210 ...

可以在单个(!)中提取位序列byte使用以下方法

代码语言:javascript
复制
public byte extract(byte[] array, int startByte, int startBit, int numberOfBits)  {
  return  (byte) ((array[startByte] >> startBit) & ~(-1 << numberOfBits));
}

startBit + numberOfBits必须为≤8。否则,所寻址的位序列将跨越数组中的多个字节。在这种情况下,您可以将非常相同的原则应用于连接在一起的下一个字节:

代码语言:javascript
复制
public uint extract32(byte[] array, int startByte, int startBit, int numberOfBits)  {
  ulong block =
      ((ulong) array[(startByte+4) % array.Length] << 32)
    | ((ulong) array[(startByte+3) % array.Length] << 24)
    | ((ulong) array[(startByte+2) % array.Length] << 16) 
    | ((ulong) array[(startByte+1) % array.Length] << 8)
    |  (ulong) array[startByte];
  return (uint) ((block >> startBit) & ~(ulong.MaxValue << numberOfBits));
}

由于uint为32位,因此numberOfBits必须为≤32。

示例:

代码语言:javascript
复制
extract32(new byte[] {0x10, 0x32, 0x54, 0x76, 0x98, 0xBA}, 1, 4, 32);

提取0xA9876543

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68657072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档