0

次のコードの出力を分析するのを手伝ってください。

int f(unsigned short x){
    int count;      
    for (count=0; x!=0; x>>=1){
        if (x & 1)
            count++;
    }
    return count;
}

int main(void){
    unsigned short x = 0x00ef;

    while (x){
        printf("%d", f(f(x)));
        x<<=4;
    }

    printf("\n");
    return 0;
}

バイナリベースでx239 または11101111として扱います。

11101111 != 0なので 、while ループに入ります: f(f( 11101111 ))、次に f のカウントは 7 に達します: 11101111から01110111から00111011** から **00011101から00001110など。(x&1!=0) で00000111が f に送信され、count が 3 で、3 が出力されて元の数値が11110000になり、f に送信される7 つのケースがあります。 00000100 count=1 で、1 が出力されると予想していましたが、出力は 3331 です。

誰かが私の間違いを指摘できますか?

4

1 に答える 1

3

元の数値が 8 ビットに制限されることを期待しているようですが、これはめったに のサイズではありませんunsigned short

最初のシフトの後、xが保持されます。0x00ef << 4つまり0x0ef0、まだ同じ数のビットが設定されています。

于 2012-07-19T09:44:07.350 に答える