-2

この奇妙な問題に遭遇しました。

4 オクテットの 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;
}
4

3 に答える 3

2

あなたの主な問題は

tmp = n;

したがって、一般に、いくつかのビットのいずれかが に設定されているかどうかを確認しています(n & tmp) ? 1 : 0

マスクにはビットを 1 つだけ設定し、値ではなくマスクをシフトする必要があります。

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");
}

必要な出力を提供する必要があります。

于 2012-10-08T19:17:20.700 に答える
1

あなたのPrintBinary機能はあまり意味がありません。tmpマスクとして使用していますがtmpn!

代わりに、次のようなものを試してください

int i;
for(i=31; i>=0; i--) {
    printf("%d", !!(n & (1<<i)));
    if(i%8 == 0) printf(".");
}
于 2012-10-08T19:17:49.017 に答える
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");
}

終了条件が (n > 0) の場合はループを使用できませんdo。または、最初のオクテットの値が 0x80 (128) 未満の場合、最初のオクテットの先行ゼロが失われます。

于 2012-10-08T19:20:28.397 に答える