二进制到十进制C ++ Qt算法返回左移2位的答案

时间:2013-09-22 23:11:24

标签: c++ qt binary decimal

我正在制作一个带有C ++的IRC机器人和用于C ++的Qt库。我环顾四周,但找不到我喜欢的二进制到十进制转换的算法。我的十进制到二进制根本不起作用,但我的bin到dec返回一个答案,转移到2位。这是我的代码:

QString MainWindow::toBin(bool isneg, QString num) {
QString buffer;
bool boolBuffer;
int intBuffer;
int bitNum;
if(isneg) {
    boolBuffer = true;
    intBuffer = 0;
    QString out;
    while(boolBuffer) {
        if(pow(2, (double)intBuffer) >= num.toDouble()) {
            boolBuffer = false;
        } else {
            intBuffer++;
        }
    }

    bitNum = intBuffer;
    intBuffer = num.toInt();
    buffer = "1";
    intBuffer = intBuffer - pow(2, bitNum);
    bitNum--;
    for(int i=bitNum;i>=0;i--) {
        if(intBuffer - pow(2, i) >= 0) {
            intBuffer = intBuffer - pow(2, i);
            buffer.append("1");
        } else {
            buffer.append("0");
        }
    }

    for(int i=0;i<buffer.length();i++) {
        if(buffer.at(i)=='1') out.append("0");
        else out.append("1");
    }

    out.append(" + 1");
    return out;
} else {
   boolBuffer = true;
   intBuffer = 0;
   while(boolBuffer) {
       if(pow(2, (double)intBuffer) >= num.toDouble()) {
           boolBuffer = false;
       } else {
           intBuffer++;
       }
   }

   bitNum = intBuffer;
   intBuffer = num.toInt();
   buffer = "1";
   intBuffer = intBuffer - pow(2, bitNum);
   bitNum--;
   for(int i=bitNum;i>=0;i--) {
       if(intBuffer - pow(2, i) >= 0) {
           intBuffer = intBuffer - pow(2, i);
           buffer.append("1");
       } else {
           buffer.append("0");
       }
   }

   return buffer;
}
}

QString MainWindow::toDec(bool isneg, QString num) {
QString buffer;
int intBuffer;
if(isneg) {
    buffer = num;
    intBuffer = 0;
    for(int i=0;i<buffer.length();i++) {
        if(buffer.at(i)=='1') intBuffer = intBuffer + pow(2, abs(buffer.length()-i-1));
    }
    buffer = QString::number(-1*intBuffer);

    return buffer;
} else {
    buffer = num;
    intBuffer = 0;
    for(int i=0;i<buffer.length();i++) {
        if(buffer.at(i)=='1') intBuffer = intBuffer + pow(2, abs(buffer.length()-i-1));
    }
    buffer = QString::number(intBuffer);
    ui->textBrowser->append(buffer);
    return buffer;
}
}

其他一切正常,我已经测试了它并且它被调用,消息的发送很好,我已经完成并手动输入QString&#34; 10&#34;,然后运行代码我在文档中写下变量时的头脑,我得出结论2,但是当我调用函数时它返回8。

1 个答案:

答案 0 :(得分:1)

您可以采用不同的方法。而不是尝试计算每个字符串位置的位值,每次获得新数字时,只需将数字加倍。这是大多数算法所做的(你知道,你不喜欢的那些):

QString MainWindow::toDec(bool isneg, QString num) {
    int val = 0;

    for( int i = 0; i < num.length(); i++ ) {
        val = (val << 1) + num.at(i).digitValue();
    }

    return QString::number( isneg ? -val: val);
}

我不确定你的“消极”代表性。二元否定通常是二进制补码形式。此十进制转换不适用于此。


[edit] 你知道,我只是想到你的输入不合理。您的算法和我的简化都依赖于仅包含01字符的字符串。但我愿意打赌你在那个字符串中有其他角色。

对此的修复需要修改循环:

for( int i = 0; i < num.length(); i++ )
{
   int bit = num.at(i).digitValue();
   if( bit != 0 && bit != 1 ) break;
   val = (val << 1) + bit;
}