我正在制作一个带有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。
答案 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] 你知道,我只是想到你的输入不合理。您的算法和我的简化都依赖于仅包含0
或1
字符的字符串。但我愿意打赌你在那个字符串中有其他角色。
对此的修复需要修改循环:
for( int i = 0; i < num.length(); i++ )
{
int bit = num.at(i).digitValue();
if( bit != 0 && bit != 1 ) break;
val = (val << 1) + bit;
}