我编写的程序的一部分涉及获取整数列表(例如15,18,25)并将每个整数转换为二进制。我在遍历列表并使用以下代码行转换每个代码:
std::string binary = std::bitset<8>(v).to_string();
((v)是整数I&lt; m转换)
但是这行代码的问题在于它定义了输出的二进制字符串的长度,因此2将成为&#34; 00000010&#34; 31将成为&#34; 00011111&#34;当然我不能让它太低,否则我会遇到更大数字的麻烦,但我希望每个二进制字符串的长度等于实际二进制数(2是&#34; 10&#34;,31是&#34; 11111&#34;)。我有我的理由。
所以我尝试更换&lt; 8&gt;根据以下代码尝试转换的数字I改变的int:
int length_of_binary;
if (v <= 1) {
length_of_binary = 1;
}
else if (v <= 3) {
length_of_binary = 2;
}
else if (v <= 8) {
length_of_binary = 4;
}
else if (v <= 16) {
length_of_binary = 5;
}
else if (v <= 32) {
length_of_binary = 6;
}
std::string binary = std::bitset<length_of_binary>(v).to_string();
问题是当我将鼠标悬停在(现在波浪下的)变量length_of_binary上时会出现以下错误:
"+5 overloads. expression must have a constant value."
并且程序不会编译。我甚至尝试通过分配来欺骗编译器
length_of_binary的值为const int,但它仍然无法工作。
有没有办法解决这个问题?如果不是有一段代码/功能会给我我需要的东西吗?
答案 0 :(得分:2)
正如评论中已经提到的:您面临的问题是需要在编译时知道该值(不依赖于运行时)。
因此,您可以使用固定表示,例如std::bitset<N>
将其转换为您已经完成的字符串,然后修剪前导零。
它可以这样实现:
std::string text = std::bitset<8>(25).to_string(); // binary representation
text.erase(0, text.find_first_not_of('0')); // zeroes trimmed
std::cout << text; // prints out: 11001
请注意,这只是一个例子。您仍然需要处理0
的情况并考虑您的输入数据是否不会超过8位表示。
然而,使用这种方法,您不需要length_of_binary
变量和相关的if-else
部分 - 这简化了代码。