如何从字节中获取特定位?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

我有一个字节,特别是来自一个字节数组的字节,它是通过从另一个设备发送的UDP传入的。这个字节在设备中存储8个中继的ON/OFF状态。

如何在所述字节中获取特定位的值?理想情况下,扩展方法看起来最简洁,返回bool对我来说最有意义。

public static bool GetBit(this byte b, int bitNumber)
{
    //black magic goes here
}
提问于
用户回答回答于

轻松点。使用按位方式,并将你的数字与2^位编号值进行比较,该值可以通过位移位来计算成本较低。

//your black magic
var bit = (b & (1 << bitNumber-1)) != 0;

一个按位进行比较的数字,逐位比较,使用一个和连接生成一个数字,该数字是位的组合,其中第一位和第二位都是在该位置设置的。下面是“啃”中的逻辑矩阵和逻辑,它显示了按位操作和:

  0101
& 0011
  ----
  0001 //Only the last bit is set, because only the last bit of both summands were set

在你的情况下,我们比较你传递的数字和只有你想要查找的位的数字。假设你在寻找第四部分:

  11010010
& 00001000
  --------
  00000000 //== 0, so the bit is not set

  11011010
& 00001000
  --------
  00001000 //!= 0, so the bit is set

位移位,产生我们想要比较的数字,听起来就像:取数字,表示成一组比特,然后将这些位左或右移出一定数量的位置。因为这些是二进制数,所以每一个位比右边的一个大2倍,向左移动相当于每移动一次,等于将这个数字乘以2^x。“。。。在你的示例中,查找第四位,我们执行:

       1 (2^0) << (4-1) ==        8 (2^3)
00000001       << (4-1) == 00001000

用户回答回答于

扫码关注云+社区