【问题标题】:How to represent binary data in 8 bits in C如何在 C 中用 8 位表示二进制数据
【发布时间】:2015-04-19 10:00:48
【问题描述】:
#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位置附加一个零?

【问题讨论】:

  • 你的意思是你想要 8 位的块吗?因为您的“任何十进制数”都不适合 8 位。
  • 你必须记录你的实际二进制数有多长(辅助变量 mb?),在你看到之后决定在开头附加多少个零。
  • 如果您的号码是 64 到 255,它会起作用。您正在生成足够的数字来表示该数字。有几种方法可以解决这个问题...

标签: c


【解决方案1】:

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

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

【讨论】:

    【解决方案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。

    【讨论】:

    • 如果能帮到你我会很高兴:)
    【解决方案3】:

    用它来打印你的结果:

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

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


    编辑

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

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

    【讨论】:

    • 如果是负数呢?然后你会想要领先的。
    • 如果你想处理signed int,你需要一个不同的算法。 OP的算法是为unsigned int设计的
    • @Beko:为什么不呢。它不取决于OP真正想要什么吗?如果 OP 希望前导 1 作为符号位怎么办?
    • 位数组必须初始化为0才能工作。 OP 的代码只输出定义的值,你的不输出。
    • @DrKoch 你是怎么得出这个结论的?我看到它的方式必须适用于“任何十进制”数字。 @ slebetman 好吧,我假设它是 2 的补码。但是,是的,这取决于他真正想要什么。
    猜你喜欢
    • 2018-09-15
    • 2012-07-02
    • 1970-01-01
    • 2021-02-11
    • 2019-07-18
    • 2013-12-08
    • 2013-10-14
    • 1970-01-01
    • 2016-10-31
    相关资源
    最近更新 更多