为什么我总是必须除以 49 才能得到二进制转换器 + cout 歧义的正确答案?
Why do I always have to divide by 49 to get the right answer for a binary converter + cout ambiguity?
我最近开始学习C++,如果我犯了一个愚蠢的错误,很抱歉......为什么我必须除以 49 才能得到正确答案?例如,如果我输入"1111"
那么答案是 735 而不是 15。
所有数字都会发生这种情况,例如,如果我输入"10"
那么答案是 98 而不是 2。另外,为什么我的cout
显示不明确的值?我正在使用Visual Studio 2013。(请注意,除以 49 发生在最后一行)
void binaryToDecimal() {
string number = getNumber();
int sum = 0;
int factor = 1;
for (int i = number.length() - 1; i >= 0; i--) {
if (number.at(i) != '0' && number.at(i) != '1') {
cout << "Number is not in binary form" << endl;
system("pause");
exit(1);
}
if (number.at(i) == '1') {
sum += number.at(i) * factor;
}
factor *= 2;
}
cout << "'" << number << "' in binary is '" << sum / 49 << "'" << endl;
}
string
s 中的字符存储在内部,与int
s 不同。这个小代码片段希望能帮助你更好地理解这个神奇的数字。
#include <iostream>
#include <string>
using namespace std;
int main(void){
std::string test("1234");
for(size_t i = 0; i < test.size(); i++){
std::cout << static_cast<int>(test.at(i)) << std::endl;
}
return 0;
}
其输出为:
49
50
51
52
特别要注意的是,将字符串"1"强制转换为int
的值为 49。
为了避免这种神奇的数字方法,您可能需要做以下两件事之一:
使用字符串进行整数转换,如boost::lexical_cast
或"字符串流",首先将字符串转换为整数表示形式,然后进行处理。但是,这会更改逻辑,因为您现在使用一些不同的数学。
或者,如果你想保持逻辑基本相同,那么最简单的办法就是一旦你通过了输入阶段,就不要在内部处理char
:
using namespace std;
bool binaryToDecimal() {
string raw_input("101");//This would be your get_number function
int sum = 0;
int factor = 1;
for (size_t i = raw_input.length()-1; i > 0; i--) { //I think you also had an off by one error here
if (raw_input.at(i) != '0' && raw_input.at(i) != '1') {
cout << "Number is not in binary form" << endl;
return false;
}
if (raw_input.at(i) == '1') {
sum += factor; //Previously you had a completely unnecessary number.at(i) in here
}
factor *= 2;
}
cout << "'" << raw_input << "' in binary is '" << sum << "'" << endl; //No more magic number required now!
return true;
}
ASCII 中的数字被分配到代码点 0x30-0x39(或 48-57)中。當你將某物乘以'1'
當然,它總是在結果中包含'1'
術語,即49。您需要通过从字符中减去'0'
来将'0'
和'1'
转换为整数值
另外,无需乘法,只需从左到右读取字符串并移位,它会快得多
相关文章:
- 转换器练习:跳过 if 语句和 if 语句
- 使用转换器提升 Python 问题 - 静态链接
- 我写的 ASCII 到二进制转换器C++向后显示二进制,如何使其正确显示?
- 十进制到二进制转换器 c++
- 用于 boost::p roperty_tree 的通用枚举转换器
- 为什么我的C++基转换器中出现分段错误?
- 将字节数组转换为对象C++ |C++中的 C# 位转换器
- 英语到摩尔斯电码转换器
- 我用c++做了一个转换器,把英里转换成公里,把公里转换成英里,把赛尔修斯转换成法赫伦海特,把法赫伦海特转换成赛尔修斯
- 使用 Json 转换器反序列化 WCF 服务中的C++字符串
- 十进制,包括负到 32 位二进制转换器
- 输出使用 cout 转换为 ASCII 的文本时输出格式不正确,C++
- 标准::映射转换器模板
- 英里到千克转换器练习的小语法错误
- 句子转换器在存在新行的情况下不起作用
- 在C Windows程序中获取A/D转换器示例程序
- ROS中未定义的参考误差到OpenCV图像转换器
- 表达式到C++类类型转换器/类型转换
- 这里怎么了?单位转换器
- 为什么我总是必须除以 49 才能得到二进制转换器 + cout 歧义的正确答案?