gpt4 book ai didi

c# - 从字节中获取特定位

转载 作者:IT王子 更新时间:2023-10-29 03:37:56 25 4
gpt4 key购买 nike

我有一个字节,特别是来自字节数组的一个字节,它是通过从另一台设备发送的 UDP 传入的。该字节存储设备中8个继电器的开/关状态。

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

public static bool GetBit(this byte b, int bitNumber)
{
//black magic goes here
}

最佳答案

简单。使用按位 AND 将您的数字与值 2^bitNumber 进行比较,这可以通过位移来廉价地计算。

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

编辑:添加更多细节,因为有很多类似的答案没有解释:

按位 AND 逐位比较每个数字,使用 AND 连接生成一个数字,该数字是该位置的第一位和第二位都已设置的位组合。这是“半字节”中的 AND 逻辑的逻辑矩阵,它显示了按位 AND 的操作:

  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

现在您知道它是如何完成的,底层发生了什么,以及它为什么起作用。

关于c# - 从字节中获取特定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4854207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com