在C语言中打印一个字符的二进制表示

14

我希望有一种非常基础的方法来打印出一个字符的二进制表示。但是我似乎找不到任何示例代码。

我以为可以用几行代码实现,但是我找到的所有东西都过于冗长复杂,使用了很多我以前没用过的函数。经常会出现atoi, 但这并不是标准函数。

是否有一种简单的函数或编写函数的简单方法,可以接受一个char变量,然后打印出二进制表示?

例如:输入参数为字符'x',输出" x is 0111 1000"。

这是一项学校任务,我必须接受用户输入的字符串并将其打印为二进制。我只需要掌握将char转换为二进制的基础知识,但我目前遇到困难。


1
你应该发布你的尝试... - Mitch Wheat
https://dev59.com/QVzUa4cB1Zd3GeqP3n7x - rags
https://dev59.com/nFTTa4cB1Zd3GeqPoQEx - rags
4个回答

25

你需要使用位运算符依次掩码位并将它们打印到标准输出。

  1. C中的char保证为1字节,因此循环8次。
  2. 在每次迭代中,掩码掉最高位。
  3. 一旦得到它,只需将其打印到标准输出。

这是一个快速尝试,希望它有意义...

main() {
  char a = 10;
  int i;
  for (i = 0; i < 8; i++) {
      printf("%d", !!((a << i) & 0x80));
  }
  printf("\n");

  return 0;
}

为了获取位,我向左移位以获得编号的位(从最高到最低,因此易于打印),然后使用掩码屏蔽它。然后我使用 !! 将其转换为 01

CodePad.


这太完美了,正是我一直在寻找的!我会阅读关于屏蔽移位运算符的内容,以便我可以完全理解它。如果您有时间,能否解释一下“最高位比特掩码”的含义。根据我的当前知识,我不确定在for循环内部的主要行中发生了什么。 谢谢! - user1783150
高位比特是第7位,例如在1000000中的1(也是数字0x80128)。 - alex
我还有点好奇 "!!" 运算符是如何工作的?它是否将任何正数转换为 "1" 并将 0 保留为 "0"?说实话,谷歌搜索 '"!!" operator C' 没有返回任何结果。它不是标准运算符吗? - user1783150
4
不是使用 !! 运算符,而是两个 ! 运算符。一个 ! 运算符可以对一个值进行取反操作,返回 01 。两个 ! 运算符可以将它再取反一次,通常用于其副作用或将该值转换为其相应的 01 值。 - alex
@alex,我认为你在第二条评论中犯了一个小错误,将第6位称为第7位。我想你的意思是在10000000中说1,而不是在1000000中说1(我们必须添加一个额外的0)。 - Chrisuu
显示剩余3条评论

2
您可以使用这种方法。
const char *byte_to_binary(int x)
{
    static char b[9];
    b[0] = '\0';

    int z;
    for (z = 128; z > 0; z >>= 1)
    {
        strcat(b, ((x & z) == z) ? "1" : "0");
    }

    return b;
}

获取二进制表示并打印

例如

 printf("%s\n", byte_to_binary(15));

2
void printBits(size_t const size, void const * const ptr)
{
    unsigned char *b = (unsigned char*) ptr;
    unsigned char byte;
    int i, j;

    for (i=size-1;i>=0;i--)
    {
        for (j=7;j>=0;j--)
        {
            byte = b[i] & (1<<j);
            byte >>= j;
            printf("%u", byte);
        }
    }
    puts("");
}

int main(int argv, char* argc[])
{
        int i = 23;
        uint ui = UINT_MAX;
        float f = 23.45f;
        printBits(sizeof(i), &i);
        printBits(sizeof(ui), &ui);
        printBits(sizeof(f), &f);
        return 0;
}

1
尝试这个:-
#include <limits.h>
char *chartobin ( unsigned char c )
{
    static char bin[CHAR_BIT + 1] = {0};
    int i;
    for( i = CHAR_BIT - 1; i >= 0; i-- )
    {
        bin[i] = (c % 2) + '0';
        c /= 2;
    }
   return bin;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接