我试图将一个字符串(如“12345”)转换为布尔向量中的二进制表示(因此它将是{1,1,0,0,0,0,0,0,1,1,1,0,0,1}
,但目前的尝试仅适用于“0”到“9”的字符串输入。对于“10”到“19”,它关闭了2(例如:10应该是1,0,1,0
,但我得到的是1,0,0,0
),对于“20”到“29”,它的值多减2(例如:20应该是1,0,1,0,0
,我得到1,0,0,0,0
)。
这是我目前的尝试,但我愿意完全重新设计。我希望这是一个简单的修复(感觉应该很容易,就像......每10个增加2个?)但有一个警告,这一直在破坏一切:
我不能将字符串输入转换为int或long long,因为字符串将包含一个对于内置类型来说太大的数字(它将有数千位数字),并且我试图在没有任何外部库(如boost)的情况下做到这一点。
std::vector<bool> stringToBinary(std::string num) {
std::vector<bool> bin;
int n = ceil(log2(pow(10, num.size())));
for (int i = 0; i < num.size(); i++) {
int x = num[i] - '0';
std::vector<bool> bits;
while (x > 0) {
bits.push_back(x % 2);
x /= 2;
}
std::reverse(bits.begin(), bits.end());
int m = bits.size();
for (int j = 0; j < n - 4 * i - m; j++) {
bin.push_back(false);
}
for (int j = 0; j < m; j++) {
bin.push_back(bits[j]);
}
}
while (bin.size() > 1 && bin.front() == false) {
bin.erase(bin.begin());
}
return bin;
}
先谢谢你了!
1条答案
按热度按时间hi3rlvi21#
既然你要求在C中完成这个,我假设你可以使用C库。在这种情况下,你可以做以下事情:
您应该很容易将最后一个std::string转换为std::vector
好吧,在你的评论中提供的信息,这里是一个修订版本,你应该能够得到任何整数的二进制表示:
以下是我从中找到有用信息的一些参考资料:
How to convert a string that represents a decimal number to a string that represents its binary form?
https://www.geeksforgeeks.org/divide-large-number-represented-string/
https://www.geeksforgeeks.org/multiply-large-numbers-represented-as-strings/