如何将int分解为数字并以相同的顺序为向量分配数字



我正在使用构造函数将unsigned int作为参数,将其分解成数字,然后将适当的truefalse值分配给vector对象。但是问题在于,我差的逻辑会以相反顺序分配值,因为最后一个数字首先分开,依此类推。我编写的代码是:

vector<bool> _bits; 
uBinary(unsigned int num){  
    int i = 1;
    while(num > 0)
    {
        int d = num%10;
        num /= 10;
        _bits.resize(i++);
        if(d == 1)
        {
            _bits[_bits.size() - 1] = true; 
        }
        else if(d==0)
        {
            _bits[_bits.size() - 1] = false;
        }
    }
}

例如:如果参数10011传递给函数uBinary(),则将向量对象分配此顺序11001true,true,false,false,true中的值,该值被逆转。我在这里需要做的只是,我想分配值而不反转订单,而我不想为此目的使用另一个循环。

一种方法是以最高可能的数字启动(unsigned int在大多数平台上只能保持值高达4294967295(,而忽略了领先的零,直到找到第一个实际数字为止:

for (uint32_t divisor = 1000000000; divisor != 0; divisor /= 10) {
    uint32_t digit = num / divisor % 10;
    if (digit == 0 && _bits.size() == 0 && divisor != 1)
        continue;  // ignore leading zeros
    _bits.push_back(digit == 1);
}

但是,在反向中找到数字,然后简单地逆转它们要简单得多(至少高效(:

do {
    _bits.push_back(num % 10 == 1);
    num /= 10;
} while (num != 0);
std::reverse(_bits.begin(), _bits.end());

您可以使用另一个循环或std::reverse进行反向的一种方法是使用递归。借助递归,您可以沿着int行走,直到击中最后一个数字,然后在呼叫返回时将值添加到向量中。看起来像

void uBinary(unsigned int num)
{   
    if (num == 0)
        return;
    uBinary(num / 10);
    _bits.push_back(num % 10 ? true : false);
}

您可以看到使用

int main()
{
    uBinary(10110);
    for (auto e : _bits)
        std::cout << e << " ";
}

实时示例


请注意,建议不要在变量名称中使用领先的下划线。一些名称保留用于实施,如果您使用一个名称,则是未定义的行为。有关名称中下划线的完整说明,请参见:在C 标识符中使用下划线的规则是什么?

最新更新