2015-03-30 85 views
0

我有一個任務,需要我將浮點數轉換爲IEEE 754二進制表示。我已經完成了部分部分,但我不知道如何將數字分解成部分(信號,指數和分數)。這裏是我有的代碼:如何在零件中分解二進制數? C語言

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?我沒有那樣做...... 謝謝!

+0

爲什麼不能直接顯示'f'的位?他們已經在IEEE 754表示 – 2015-03-30 20:54:42

+0

該任務讓我把它分解成幾部分,並說哪個部分是哪個.. – 2015-03-30 20:55:37

+0

還是一樣的。該標準對於固定位置具有固定的含義,所以我沒有看到問題。 – 2015-03-30 20:58:27

回答

1

「另外,有人可以解釋爲什麼有一個循環,從7開始,到0?我沒有這樣做......謝謝!」

這個循環是處理一個字節 - 是一個字節是8位,所以從7開始到包含0爲止。它的一部分是確保只有一個位存儲在變量中位。這個循環的功能是逐位打印出字節。

既然你有位部分做,你可以存儲到像一個uint32_t的或只是一個int如果值是不大於31(簽有對結果產生影響)

例如

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; 

這會按照打印出來的順序存儲這些位。

+0

'size'將會是4,因此你的'data [size-5]'等等是錯誤的。 – halex 2015-03-31 07:49:51

相關問題