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(つまり、charat のアドレスbufpが指している)、 の 8 ビットと ORをとっていますvaluebufp次に、バッファ内の次のバイトに進むためにインクリメントします。その後、8 を追加しますshift-- これにより、新しいバイトのどの8 ビットvalueが OR されるかが決まります。つまり、shiftは 0 から始まるので、最初の反復では、 の最初のバイトbufpが の下位 8 ビットをvalue置き換えます (0 から始まるため、 を置き換えます)。次の反復子では、 の次のバイトがbufp8 バイト左にシフトされ、 の次の 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 の値にシフトされ、その結果が OR|されてvalueインクリメントbufpされます。

最後に shift の値がshift +=8手段によって変更されますshift = shift + 8

bufpwhile ループは become にlenなるまで終了しないため、すべてのバイトが取得されます0

于 2012-12-05T06:14:49.733 に答える