1

任何人都可以在初级 C 程序员可以理解的水平上解释这个函数的作用吗?

unsigned getunsigned(unsigned char *bufp, int len) {
    unsigned value = 0;
    int shift = 0;
    while (len--) {
        value |= *bufp++ << shift;
        shift += 8;
    }
    return value;
}

我想最让我头疼的一句话是:

value |= *bufp++ << shift;

另外,任何人都可以提供一种方法来重写它,以便没有经验的 C 程序员更清楚地理解吗?

我在为一项作业进行研究时在网上找到了这段代码,除非我完全理解它在做什么以及它是如何做的,否则我宁愿不使用它。

4

3 回答 3

5

这是从 指向的缓冲区中获取连续字节bufp,并将它们放入value.

value |= *bufp++ << shift;取值 at bufp(即,char地址bufp指向)并将其与 8 位进行或运算value。然后它递增bufp指向缓冲区中的下一个字节。之后,它将 8 添加到shift- 这就是确定新字节的8 位被 ORed 的原因。value即,shift从 0 开始,因此在第一次迭代中,第一个字节替换(替换,因为它们从 0 开始)bufp的底部 8 位。value在下一个迭代器中, 的下一个字节bufp被左移 8 个字节,以替换 的下一个 8 位value,依此类推len

旁白:如果len大于sizeof(unsigned),这将超过 的结尾value,导致未定义的行为。

于 2012-12-05T06:14:00.363 回答
1
value |= *bufp++ << shift;

相当于

value = value | (*bufp << shift);
bufp++;
于 2012-12-05T06:13:49.480 回答
1
value |= *bufp++ << shift;

相当于

value =  value | (*bufp << shift);
bufp++;

bufp 中的第一个值被移位到 shift 中的值,结果是 ORed |value然后bufp递增。

最后的 shift 值是通过shift +=8手段改变的shift = shift + 8

所以它占用了bufp因为 while 循环中的所有字节,直到len变成0

于 2012-12-05T06:14:49.733 回答