四个八位字节的二进制表示

时间:2012-10-08 19:00:39

标签: c bit-manipulation

我偶然发现了这个奇怪的问题。

我有两对四个八位字节。

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

3 个答案:

答案 0 :(得分: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");
}

应该提供所需的输出。

答案 1 :(得分:1)

您的PrintBinary功能没有多大意义。您使用tmp作为掩码,但tmp等于n

相反,尝试类似

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

答案 2 :(得分: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) )。