0

浮動小数点数を IEEE 754 バイナリ表現に変換する必要がある課題があります。ビットの部分はすでに完了していますが、数値を部分 (信号、指数、分数) に分割する方法がわかりません。ここに私が持っているコードがあります:

typedef unsigned char Byte;

void showbits(char str[], Byte data[], int size) {

    int i, j;
    int bit;



    printf ("%s = ", str);

    for(i = size-1; i>=0; i--){
        for(j = 7; j >= 0; j--){
            bit = (data[i] >> j) & 1;

            printf ("%d", bit);
        }
        printf (" ");
    }
    printf ("\n");
    printf("signal: %d\n", (data[size - 1] >> 7) & 1);

    printf("exponential: ");

            printf("%d", (data[size-2] >> 6) & 1);
            printf("%d", (data[size-3] >> 5) & 1);
            printf("%d", (data[size-4] >> 4) & 1);
            printf("%d", (data[size-5] >> 3) & 1);
            printf("%d", (data[size-6] >> 2) & 1);
            printf("%d", (data[size-7] >> 1) & 1);
            printf("%d", (data[size-8] >> 0) & 1);
            printf("%d", (data[size-9] >> 7) & 1);

    printf("\nfraction: ");

            printf("%d", (data[21] >> 6) & 1);
            printf("%d", (data[20] >> 5) & 1);
            printf("%d", (data[19] >> 4) & 1);
            printf("%d", (data[18] >> 3) & 1);
            printf("%d", (data[17] >> 2) & 1);
            printf("%d", (data[16] >> 1) & 1);
            printf("%d", (data[15] >> 0) & 1);
            printf("%d", (data[14] >> 7) & 1);
            printf("%d", (data[13] >> 6) & 1);
            printf("%d", (data[12] >> 5) & 1);
            printf("%d", (data[11] >> 4) & 1);
            printf("%d", (data[10] >> 3) & 1);
            printf("%d", (data[9] >> 2) & 1);
            printf("%d", (data[8] >> 1) & 1);
            printf("%d", (data[7] >> 0) & 1);
            printf("%d", (data[6] >> 7) & 1);
            printf("%d", (data[5] >> 6) & 1);
            printf("%d", (data[4] >> 5) & 1);
            printf("%d", (data[3] >> 4) & 1);
            printf("%d", (data[2] >> 3) & 1);
            printf("%d", (data[1] >> 2) & 1);
            printf("%d", (data[0] >> 1) & 1);

}

int main(int argc, const char * argv[]) {

    float f;

    scanf("%f", &f);

    showbits("float", (Byte *)&f, sizeof(float));

    return 0;
}

また、7 から始まり 0 になるループがある理由を説明してもらえますか? 私はその部分をしませんでした.ありがとう!

4

1 に答える 1

1

「また、7 から始まり 0 になるループがある理由を誰か説明してもらえますか? 私はその部分を実行していません... ありがとう!」

このループは 1 バイトを処理するためのものです。1 バイトは 8 ビットであるため、7 から始まり 0 が含まれます。その & 1 部分は、変数ビットに 1 ビットのみが格納されるようにするためのものです。このループの機能は、バイトをビットごとに出力することです。

ビット部分が完了したので、値が 31 以下の場合は uint32_t または単に int のようなものに格納できます (結果に影響を与える符号)。

例えば

uint32_t exp = 0;
printf("exponential: ");

        exp |= ((data[size-2] >> 6) & 1) << 7;
        exp |= ((data[size-3] >> 5) & 1) << 6;
        exp |= ((data[size-4] >> 4) & 1) << 5;
        exp |= ((data[size-5] >> 3) & 1) << 4;
        exp |= ((data[size-6] >> 2) & 1) << 3;
        exp |= ((data[size-7] >> 1) & 1) << 2;
        exp |= ((data[size-8] >> 0) & 1) << 1;
        exp |= (data[size-9] >> 7) & 1;

これにより、ビットが出力されるのと同じ順序でビットが格納されます。

于 2015-03-31T01:44:36.113 に答える