有没有一种方法让用户在C或C++中输入二进制数?
如果我们编写如下代码:
int a = 0b1010;
std::cout << a << std::endl
当使用适当的编译器扩展时,输出结果为10。
但是当我们尝试编写以下代码时
int n;
std::cin >> n;
int t = 0bn;
当我们尝试使用字符串存储输入时,会出现错误。有没有人能提供一种直接读取二进制数作为输入的方法?请注意,保留HTML标记。
有没有一种方法让用户在C或C++中输入二进制数?
如果我们编写如下代码:
int a = 0b1010;
std::cout << a << std::endl
当使用适当的编译器扩展时,输出结果为10。
但是当我们尝试编写以下代码时
int n;
std::cin >> n;
int t = 0bn;
当我们尝试使用字符串存储输入时,会出现错误。有没有人能提供一种直接读取二进制数作为输入的方法?请注意,保留HTML标记。
虽然没有直接读取二进制数的函数,但有函数 strtox
(其中 x 代表数据类型),可以将包含二进制数(或任何其他基数的数字)的字符串转换为数字值。
因此,解决方案是首先将数字读取为字符串,然后将其转换。
示例:
char input[100];
char *endpointer;
<read input using either C or C++ syntax>
int n = (int) strtol(input, &endpointer, 2);
这里有些混淆,让我们稍微梳理一下。
0b1010
是一个整数字面量,一个常量,在编译时以二进制形式表示的整数值。同样,0xA
是16进制的字面量,10
是10进制的。 所有这些都指代同一个整数,只是告诉编译器你想要哪个数字的不同方式而已。在运行时,在内存中,这个整数始终以二进制数表示。
std::cout << a
;获取a
的整数值并输出其字符串表示形式。默认情况下,它以十进制输出,但你可以使用std::hex
修改符将其输出为十六进制。 没有预定义的修改符可用于以二进制打印。因此,你需要自己完成(或者搜索一下,这是一个常见问题)。
0b
最后,仅用于定义整数字面量。它不是运行时操作符。回忆一下,所有int
在内存中都表示为二进制数。从机器的角度来看,其他进制不存在,int
就是int
,所以没有什么需要转换的。如果需要从字符串中读取二进制数,你需要编写与打印相反的代码(std::cin >> n
假定输入是十进制数,因此如果输入实际上应该是二进制数,则读取错误的数字)。
unsigned
整数类型实际上是基于2的,具有正常的位值顺序:它们在模2 ^ n处进行包装,其中n是该特定大小的整数值表示中的位数*(N4140第3.9.1节基本类型,第4项)。而unsigned char
没有填充:所有对象位都是值表示位。(您可以强制转换为“char *”来查看任何内容的表示形式)。三进制硬件需要模拟...位顺序要求来自移位的描述,因为它实际上是移动位,而不是* 2
。) - Peter Cordes将二进制数作为输入,我经常使用两种方法:
(提示:将输入作为字符串!!!使用:#include <string>
)
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
string
库中的stoi()
方法
#include <string>
包含string
库。示例:
string s;
cin>>s; // Suppose s = "100100101"
int n = stoi(s, 0, 2);
cout<<n; // 293
stoi()
的格式这里。宁愿自己做:
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);
bin
IO操作符来配合hex
、dec
和oct
。也许现在二进制字面量已经成为标准,我会尝试提出一个建议。 - emsr