如何用C表示8位二进制数据

时间:2015-04-19 10:00:48

标签: c

#include<stdio.h>

int main()
{
    long int decimalNumber,remainder,quotient;
    int binaryNumber[100],i=1,j;

    printf("Enter any decimal number: ");
    scanf("%ld",&decimalNumber);
    quotient = decimalNumber;

    while(quotient!=0)
    {
        binaryNumber[i++]= quotient % 2;
        quotient = quotient / 2;
    }

    printf("Equivalent binary value of decimal number %d: ",decimalNumber);

    for(j = i -1 ;j> 0;j--)
        printf("%d",binaryNumber[j]);

    return 0;
}

我希望输出为8位二进制形式,但结果如下所示,C中是否有任何运算符可以将7位数据转换为等效的8位数据?谢谢

示例输出:

  

输入任意十进制数:50

     

十进制数50的等效二进制值:110010

所需输出为00110010,为8位,如何在MSB位置附加零?

3 个答案:

答案 0 :(得分:2)

修改您的代码,如下所示:

  quotient = quotient / 2;
}
/* ---- Add the following code ---- */
{
  int group_size = 8;  /* Or CHAR_BIT */
  int padding = group_size  - ((i-1) % group_size); /* i was inited with 1 */
  if(padding != group_size) {
     /* Add padding */
     while(padding-- != 0) binaryNumber[i++] = 0;
  }
}
/* ------- Modification ends -------- */
printf("Equivalent binary value of decimal number %d: ",decimalNumber);

此代码计算打印数字所需的padding bits数,并用0填充填充位。

Live demo here

如果您想要7位回答,请将group_size更改为7。

答案 1 :(得分:1)

用它来打印你的结果:

for(j = 7; j>0; j--)
    printf("%d", binaryNumber[j]);

这总是打印8个二进制数字。

<小时/> 的修改

必须使用零初始化int数组binaryNumber才能使其工作:

for(int i=0; i<8; i++) binaryNumber[i] = 0;

答案 2 :(得分:1)

一种非常方便的方式,它有一个函数以字符串的形式返回二进制表示。这允许二进制表示在正常printf格式字符串中使用,而不是在当前光标位置处吐出位。要指定确切的位数,必须将二进制字符串填充到所需的位数(例如8,16,32 ......)。下面使用static变量来允许返回缓冲区,但是通过动态地为缓冲区分配空间可以很容易地实现。不需要预处理器检查,因为您可以简单地将缓冲区的长度硬连接到64 + 1,但为了完整起见,包括x86/x86_64的检查并相应地设置BITS_PER_LONG。 / p>

#include <stdio.h>

#if defined(__LP64__) || defined(_LP64)
# define BUILD_64   1
#endif

#ifdef BUILD_64
# define BITS_PER_LONG 64
#else
# define BITS_PER_LONG 32
#endif

char *binstr (unsigned long n, size_t sz);

int main (void) {

    printf ("\n 50 (decimal)  :  %s (binary)\n\n", binstr (50, 8));

    return 0;
}

/* returns pointer to binary representation of 'n' zero padded to 'sz'. */
char *binstr (unsigned long n, size_t sz)
{
    static char s[BITS_PER_LONG + 1] = {0};
    char *p = s + BITS_PER_LONG;
    register size_t i;

    if (!n) {
        *s = '0';
        return s;
    }

    for (i = 0; i < sz; i++)
        *(--p) = (n>>i & 1) ? '1' : '0';

    return p;
}

<强>输出

$ ./bin/bincnv

 50 (decimal)  :  00110010 (binary)

注意:由于静态缓冲区,您无法在同一printf语句中重复调用。如果动态分配,可以在同一printf语句中多次调用该函数。

另外,请注意,如果您不关心填充二进制返回到任何特定长度并且只希望二进制表示从最高位开始,则可以使用以下更简单的版本:

/* simple return of binary string */
char *binstr (unsigned long n)
{
    static char s[BITS_PER_LONG + 1] = {0};
    char *p = s + BITS_PER_LONG;

    if (!n) {
        *s = '0';
        return s;
    }

    while (n) {
        *(--p) = (n & 1) ? '1' : '0';
        n >>= 1;
    }
    return p;
}