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

12

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

如果我们编写如下代码:

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

当使用适当的编译器扩展时,输出结果为10。

但是当我们尝试编写以下代码时

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

当我们尝试使用字符串存储输入时,会出现错误。有没有人能提供一种直接读取二进制数作为输入的方法?请注意,保留HTML标记。


3
谷歌搜索,第一项:http://www.cplusplus.com/forum/general/103479/ - Zaiborg
@Zaiborg,我认为这个问题实际上就是关于这个的。很遗憾他们没有一个bin IO操作符来配合hexdecoct。也许现在二进制字面量已经成为标准,我会尝试提出一个建议。 - emsr
4个回答

9

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

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

示例:

char input[100];
char *endpointer;

<read input using either C or C++ syntax>

int n = (int) strtol(input, &endpointer, 2);

9

这里有些混淆,让我们稍微梳理一下。

  • 0b1010是一个整数字面量,一个常量,在编译时以二进制形式表示的整数值。同样,0xA是16进制的字面量,10是10进制的。 所有这些都指代同一个整数,只是告诉编译器你想要哪个数字的不同方式而已。在运行时,在内存中,这个整数始终以二进制数表示。

  • std::cout << a;获取a的整数值并输出其字符串表示形式。默认情况下,它以十进制输出,但你可以使用std::hex修改符将其输出为十六进制。 没有预定义的修改符可用于以二进制打印。因此,你需要自己完成(或者搜索一下,这是一个常见问题)。

  • 0b最后,用于定义整数字面量。它不是运行时操作符。回忆一下,所有int在内存中都表示为二进制数。从机器的角度来看,其他进制不存在,int就是int,所以没有什么需要转换的。如果需要从字符串中读取二进制数,你需要编写与打印相反的代码(std::cin >> n假定输入是十进制数,因此如果输入实际上应该是二进制数,则读取错误的数字)。


我建议删除“在运行时,内存中,这个整数总是以二进制数表示。”这一部分。这是不必要的错误。在运行时,这个数字只是一个数字。(即使不在运行时,它仍然只是一个数字。)除非你使用不正当的手段,否则你看不到程序使用的表示方式,而且知道表示方式大多是无用的。它不必是二进制的,实际上,在任何主流编译器中它都不是(二进制补码甚至不是基数数字系统,那么它怎么能是二进制的呢?)。 - R. Martinho Fernandes
1
我包含了它,因为OP想要以二进制形式打印它,大多数建议是使用位运算来提取位。当然,这并不严格意味着它存储在基于2的位置,但强烈暗示了这一点。 - Alexander Gessler
@R.Martinho:关于二进制补码不是纯基数系统的有趣争论。尽管如此,它仍然是二进制的,具有除符号位之外的基数2位值。(我认为“二进制”是运行时表示的更好术语)。 - Peter Cordes
1
(顺便说一下,ISO C和C ++确实要求unsigned整数类型实际上是基于2的,具有正常的位值顺序:它们在模2 ^ n处进行包装,其中n是该特定大小的整数值表示中的位数*(N4140第3.9.1节基本类型,第4项)。而unsigned char没有填充:所有对象位都是值表示位。(您可以强制转换为“char *”来查看任何内容的表示形式)。三进制硬件需要模拟...位顺序要求来自移位的描述,因为它实际上是移动位,而不是* 2。) - Peter Cordes

6

将二进制数作为输入,我经常使用两种方法:

(提示:将输入作为字符串!!!使用:#include <string>)

  1. bitset库的bitset模板的to_ulong()方法
    • 为此,您需要使用#include <bitset>包含bitset

示例:

string s;
cin>>s; // Suppose s = "100100101"
int n = (int) bitset<64>(s).to_ulong();
cout<<n; // 293

点击此处了解更多关于bitset的内容,点击此处了解更多关于to_ulong()的内容。

  1. string库中的stoi()方法
    • 您需要使用#include <string>包含string库。

示例:

string s;
cin>>s; // Suppose s = "100100101"
int n = stoi(s, 0, 2);
cout<<n; // 293

请查看stoi()的格式这里

1

宁愿自己做:

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

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