解释这个功能的作用

时间:2012-12-05 06:11:25

标签: c

任何人都能解释一下新手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程序员更清楚地理解吗?

我在为作业进行研究时发现了这段代码,除非我完全理解它正在做什么以及它是如何做的,否则我不愿意使用它。

3 个答案:

答案 0 :(得分:5)

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

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

除此之外:如果len大于len,则会写入sizeof(unsigned)的末尾,导致未定义的行为。

答案 1 :(得分:1)

value |= *bufp++ << shift;

相当于

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

答案 2 :(得分:1)

value |= *bufp++ << shift;

相当于

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

bufp的第一个值转移到shift中的值,结果与|进行ORed value,然后bufp递增。

最后一个班次的值更改为shift +=8表示shift = shift + 8

因此它需要bufp中的所有字节,因为while len变为0时,while循环不会终止。