使用非const变量代替所需的const变量(C ++)

时间:2017-12-11 11:30:12

标签: c++ binary

我编写的程序的一部分涉及获取整数列表(例如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,但它仍然无法工作。
有没有办法解决这个问题?如果不是有一段代码/功能会给我我需要的东西吗?

1 个答案:

答案 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部分 - 这简化了代码。