如何读取二进制数作为输入?

有没有办法让用户在C或C ++中输入二进制数?

如果我们写类似的东西

int a = 0b1010; std::cout << a << std::endl 

然后输出结果为10(使用适当的编译器扩展时)。

但是当我们试着写的时候

 int n; std::cin >> n; int t = 0bn; 

它给了我们一个错误,所以任何人都可以建议我们如何直接读取二进制数作为输入而不是使用字符串来存储输入?

这里有点混乱,让我们稍微解开它。

  • 0b1010是一个整数文字 ,一个用基数2写的常量编译时整数值。同样, 0xA是基数为16的文字, 10是基数10. 所有这些都是指同一个整数 ,它只是一种不同的方式告诉编译器你的意思是哪个号码。 在运行时,在内存中,此整数始终表示为base-2数字。

  • std::cout << a ; 获取a的整数值并输出它的字符串表示。 默认情况下,它在基数10中输出它,但您可以使用std::hex修饰符将其输出到基数16. 没有预定义的修饰符以二进制forms打印 。 所以你需要自己做(或谷歌,这是一个常见的问题)。

  • 最后0b用于定义整数文字。 它不是运行时运算符。 回想一下,所有int都表示为内存中的基数2。 从机器的角度来看,其他基础不存在, intint ,所以没有什么可以转换的。 如果你需要从一个字符串中读取一个二进制数,你可以将反向代码转换为你要打印它的内容( std::cin >> n假设输入是一个基数为10的数字,所以它读取的数字是错误的输入实际上是在基数2)。

虽然没有直接读取二进制数的function, strtox有一些函数strtox (其中x表示数据类型)将包含二进制数(或任何其他基数)的字符串转换为数值。

因此解决方案是首先将数字作为字符串读取然后转换它。

例:

 char input[100]; char *endpointer;  int n = (int) strtol(input, &endpointer, 2); 

而是自己做:

 uint32_t a = 0; char c; while ((c = getchar()) != '\n') { // read a line char by char a <<= 1; // shift the uint32 a bit left a += (c - '0') & 1; // convert the char to 0/1 and put it at the end of the binary } printf("%u\n", a);