【问题标题】:Conversion between numerical bases going wrong数值基数之间的转换出错
【发布时间】:2016-10-18 18:31:54
【问题描述】:

我不知道我的程序出了什么问题。在将这个“实验”添加到我的项目之前,我刚刚测试了它是否可以在至少一个控制台应用程序上使用,你可以看到我失败了。

我创建了一个库,可以在数字基数之间转换数字(到目前为止,只有 B16 或 B2 到十进制)。这是一个很大的解决方法,因为我不太了解如何管理模数和除法,但它似乎一直有效。

我给了它一个 0xFF,它把它当作 0xFF0,结果是 4,080。我给了它一个 0x16,它把它当作 0x160,结果是 352。很明显发生了什么,但我不知道为什么会这样。至少,到目前为止,问题只出在 B16 上,尽管 B2 确实也给了我一些奇怪的错误。

这是代码(GNU 编译器上的 Code::Blocks):

int bin_to_int(char char_digit){
    char_digit = toupper(char_digit);
         if (char_digit == '0') {return 0;}
    else if (char_digit == '1') {return 1;}
    else {return 2;}
}
int hex_to_int(char char_digit){
    char_digit = toupper(char_digit);
         if (char_digit == '0') {return 0;}
    else if (char_digit == '1') {return 1;}
    else if (char_digit == '2') {return 2;}
    else if (char_digit == '3') {return 3;}
    else if (char_digit == '4') {return 4;}
    else if (char_digit == '5') {return 5;}
    else if (char_digit == '6') {return 6;}
    else if (char_digit == '7') {return 7;}
    else if (char_digit == '8') {return 8;}
    else if (char_digit == '9') {return 9;}
    else if (char_digit == 'A') {return 10;}
    else if (char_digit == 'B') {return 11;}
    else if (char_digit == 'C') {return 12;}
    else if (char_digit == 'D') {return 13;}
    else if (char_digit == 'E') {return 14;}
    else if (char_digit == 'F') {return 15;}
    else {return 16;}
}
void conv_todec(int mode_base){
    if (mode_base == 16){std::cout << "\nHex to Dec function";}
    if (mode_base ==  2){std::cout << "\nBin to Dec function";}
    if (mode_base == 16){std::cout << "\nEnter a hex number: ";}
    if (mode_base ==  2){std::cout << "\nEnter a bin number: ";}
    std::string numb;
    std::cin >> numb;
    int str_leg = numb.length();
    int total = 0;
    for(int i(0);i<str_leg;i++){
        if (mode_base == 16){
            if (hex_to_int(numb[i]) == 16){func_erro();return;}}
        if (mode_base == 2){
            if (bin_to_int(numb[i]) == 2){func_erro();return;}}
        }
    int digits[str_leg] = {};
    int j = str_leg;
    for(int i(0);i<str_leg;i++){
    if (mode_base == 16) {digits[i] = hex_to_int(numb.at(i));}
    if (mode_base ==  2) {digits[i] = bin_to_int(numb.at(i));}
    if (mode_base == 16) {total += (digits[i] * power(mode_base,j--));}
    //Somehow the number never had the first digit claiming it as
    //either even or odd, so I tried pre-decrementing 'j' and it
    //worked for some reason I don't know either.
    if (mode_base ==  2) {total += (digits[i] * power(mode_base,--j));}}
    std::cout << "The result is: " << total << std::endl;
}

【问题讨论】:

  • hex_to_int 函数不必要地冗长且低效

标签: c++ binary hex


【解决方案1】:

这一行:

 int j = str_leg;

表示对于十六进制 FF,j 将为 2。这意味着稍后当您执行 power(mode_base,j--) 与第一个数字相乘时,您将执行 power(16, 2)(请记住,j-- 表示取值j,然后从j 中减一,但仍使用原始值)。因此,您将第一个数字乘以 256,而您只想乘以 16。

解决方案? j 小一号开始。

 int j = str_leg - 1;

注意,这就是为什么当你使用--j 时你的二进制版本可以工作的原因,因为你在使用它之前会递减j。所以要么使用--jj = str_leg,要么使用j--j = strleg - 1

此外,在模部分上工作 - 这将使您的程序更容易编写。

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 2017-02-09
    • 2021-08-12
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多