2012-10-08 51 views
-2

我偶然發現了這個奇怪的問題。我得到2對四個八位組。四個八位字節的二進制表示

1) 255.255.255.0 (like a subnet mask) 
2) 128.127.0.0 (fictive mask) 

我的二進制表示應該是:

1) 11111111.11111111.11111111.00000000 
2) 10000000.01111111.00000000.00000000 

但是從我的簡單的應用程序,我得到:

1) 11111111.11111111.11111111.00000000 
2) 11111110.01111111.00000000.00000000 

我認爲這是錯誤的值,但請大家指正,我想我誤解了這件重要的事情。

生成的二進制表示的代碼是:

#include <stdio.h> 
#include <stdlib.h> 

void PrintBinary(unsigned int n) 
{ 
    unsigned int tmp; 
    int i = 1; 
    tmp = n; 
    do{ 
     printf("%d", (n & tmp) ? 1 : 0); 
     if(i % 8 == 0 && i < 32) 
      printf("."); 
     ++i; 
     n >>= 1; 
     }while(n>0); 
    printf("\n"); 
} 

int main(int argc, char **argv) 
{ 
    unsigned int octet1 = 128; 
    unsigned int octet2 = 127; 
    unsigned int octet3 = 0; 
    unsigned int octet4 = 0; 
    unsigned int a = octet1 << 24 | octet2 << 16 | octet3 << 8 | octet4; 
    PrintBinary(a); 
    return 0; 
} 
+0

你應該在這裏找到你需要的東西:http://stackoverflow.com/questions/111928/is-there-a-printf-converter-to-print-in-binary-format –

+0

你可以更具體作爲您提供的鏈接包含如何打印二進制文件,如果您測試我的代碼,那麼這不是我的問題,因爲它會打印數字的二進制表示形式,但是當打印數字時,如果涉及到二進制表示形式,那麼在我的輸出結果中很奇怪理解。 –

+0

您沒有顯示足夠的代碼。顯示一個完整的程序。不要讓我們猜測。 –

回答

1

您的PrintBinary功能沒有多大意義。您正在使用tmp作爲掩碼,但tmp等於n

相反,嘗試像

int i; 
for(i=31; i>=0; i--) { 
    printf("%d", !!(n & (1<<i))); 
    if(i%8 == 0) printf("."); 
} 
+0

我會去接受你的五個班輪。主要是因爲我沒有必要扭轉字符串。我現在看到了我的代碼中缺少的內容,最多可循環31位:P謝謝 –

2

您的主要問題是

tmp = n; 

所以在一般情況下,如果有幾位在(n & tmp) ? 1 : 0設置你正在檢查。

你的面具應該只有一個位設置,你應該改變面具,而不是值。

void PrintBinary(unsigned int n) 
{ 
    unsigned int tmp = 1 << (sizeof(unsigned int) * CHAR_BIT - 1); 
    int i = 1; 
    do{ 
     printf("%d", (n & tmp) ? 1 : 0); 
     if(i % 8 == 0 && i < 32) 
      printf("."); 
     ++i; 
     tmp >>= 1; 
     }while(tmp > 0); 
    printf("\n"); 
} 

應提供期望的輸出。

0

嘗試:

void PrintBinary(unsigned int n) 
{ 
    unsigned int tmp = n; 
    for (int i = 1; i <= 32; ++i) { 
     printf("%d", (tmp & 1)); 
     if (i % 8 == 0) 
      printf("."); 
     temp >>= 1; 
    } 
    printf("\n"); 
} 

如果你的終止條件是你不能使用do環(N> 0),否則你會丟失的前導當該字節的值小於0x80(128)時,在第一個八位字節中的零。

相關問題