gpt4 book ai didi

c - 设置位流中的位

转载 作者:行者123 更新时间:2023-11-30 21:21:01 25 4
gpt4 key购买 nike

我在处理遗留代码时遇到了以下 C 函数,我对代码的组织方式感到完全困惑。我可以看到该函数正在尝试在位流中的给定位置设置位,但我无法理解各个语句和表达式。有人可以解释一下为什么开发人员到处使用除以 8 (/8) 和模 8 (%8) 表达式吗?有没有一种简单的方法可以在 c 中读取这些类型的位操作函数?

static void setBits(U8 *input, U16 *bPos, U8 len, U8 val)
{
U16 pos;
if (bPos==0)
{
pos=0;
}
else
{
pos = *bPos;
*bPos += len;
}
input[pos/8] = (input[pos/8]&(0xFF-((0xFF>>(pos%8))&(0xFF<<(pos%8+len>=8?0:8-(pos+len)%8)))))
|((((0xFF>>(8-len)) & val)<<(8-len))>>(pos%8));
if ((pos/8 == (pos+len)/8)|(!((pos+len)%8)))
return;
input[(pos+len)/8] = (input[(pos+len)/8]
&(0xFF-(0xFF<<(8-(pos+len)%8))))
|((0xFF>>(8-len)) & val)<<(8-(pos+len)%8);
}

最佳答案

please explain why the developer used divison by 8 (/8) and modulus 8 (%8) expressions here and there

首先,请注意字节的各个位编号为 0 到 7,其中位 0 是最低有效位。一个字节有 8 位,因此“魔数(Magic Number)”是 8。

一般来说:如果你有任何原始数据,它由n组成bytes,因此始终可以被视为字节数组 uint8_t data[n] 。访问位x在该字节数组中,您可以这样做:

给定x = 17 ,然后在字节号 17/8 = 2 中找到位 x 。请注意,整数除法会“降低”该值,而不是 2.125,您会得到 2。

整数除法的余数给出该字节中的位位置,17%8 = 1 .

因此位号 17 位于字节 2 的位 1 中。data[2]给出字节。

要从 C 中的字节中屏蔽掉一位,请使用按位 AND 运算符 &用来。为了使用它,需要一个位掩码。此类位掩码最好通过将值 1 移位所需的位数来获得。位掩码可能最清楚地以十六进制表示,字节的可能位掩码将是 (1<<0) == 0x01 , (1<<1) == 0x02 , (1<<3) == 0x04 , (1<<4) == 0x08等等。

在本例中(1<<1) == 0x02 .

C 代码:

uint8_t data[n];
...
size_t byte_index = x / 8;
size_t bit_index = x % 8;
bool is_bit_set;

is_bit_set = ( data[byte_index] & (1<<bit_index) ) != 0;

关于c - 设置位流中的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30839217/

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