我认为你在数组和数字之间搞混了,特别是对于操作二进制数的含义。
我将通过示例来说明。假设您有一些错误消息,并且想要从函数的返回值中返回它们。现在,您可能会将错误标记为1、2、3、4...这在您的脑海中很有意义,但是如果只给出一个数字,如何确定发生了哪些错误呢?
现在,尝试将错误标记为1、2、4、8、16...即二的递增幂。为什么这样做有效呢?因为当您使用基数2时,您正在操作像00000000
这样的数字,其中每个数字对应于2的幂乘以其从右侧计算的位置。所以假设错误1、4和8发生了。那么,可以表示为00001101
。反过来,第一个数字= 1 * 2 ^ 0,第三个数字= 1 * 2 ^ 2,第四个数字= 1 * 2 ^ 3。将它们全部加起来得到13。
现在,我们可以通过应用位掩码来测试是否发生了这样的错误。例如,如果您想要确定错误
8
是否发生,请使用8的位表示形式=
00001000
。现在,为了提取该错误是否发生,请使用二进制与操作,如下所示:
00001101
& 00001000
= 00001000
我相信你知道&和操作的原理或者可以从以上内容中推断出来 - 按位进行运算,如果任意两个位都是1,则结果为1,否则为0。
现在,用C语言:
int func(...)
{
int retval = 0;
if ( sometestthatmeans an error )
{
retval += 1;
}
if ( sometestthatmeans an error )
{
retval += 2;
}
return retval
}
int anotherfunc(...)
{
uint8_t x = func(...)
if ( ( ( x & 0x08 ) >> 3 ) == 1 )
{
}
}
现在,进入实际操作。在存储器不足且协议没有冗长的 XML 等奢侈条件时,常见的做法是将字段限定为固定位数。在该字段中,您可以分配各种位(标志、2 的幂)表示特定含义,并应用二进制操作来推断它们是否设置,然后对其进行操作。
我还应补充说明,二进制操作与计算机的基础电子学思想密切相关。想象一下,如果比特字段对应于各种电路的输出(传递电流或不传递电流),通过使用足够多的这些电路组合,您可以制造出一台计算机。