- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个字节,特别是来自字节数组的一个字节,它是通过从另一台设备发送的 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/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!