我正在使用构造函数将unsigned int
作为参数,将其分解成数字,然后将适当的true
和false
值分配给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()
,则将向量对象分配此顺序11001
或true,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 标识符中使用下划线的规则是什么?