gpt4 book ai didi

c++ - 如何打印大于 `std::bitset`的 `unsigned long long`的十进制值?

转载 作者:行者123 更新时间:2023-12-01 15:03:43 36 4
gpt4 key购买 nike

我正在编程一个类来处理具有unsigned long long的更多位的位集的整数。

#include <bitset>
#include <string>

#define MAX_BITS 32000

class RossInt {
std::bitset<MAX_BITS> bits;

public:
RossInt(unsigned long long num); /* Copies the bits of num into the bitset */
RossInt operator+ (const RossInt& op) const;

std::string to_string() const; /* Returns the number in decimal in a string */
};

由于数字大于 unsigned long long,因此将其放入字符串中,但问题是我无法使用通常与 decimal_n += pow(2, bit_index)一起使用的方式,因为我无法将结果存储到变量中,所以我想使用尽可能少的外部库。
有没有一种方法可以使用按位运算符或任何其他方式对其进行转换?

最佳答案

经过两个晚上的放松之后,我终于找到了一种打印方法。这不是最有效的方法,我要重写它,直到对速度满意为止。

std::ostream& operator<<(std::ostream& os, const RossInt& value) {
RossInt op = value;
RossInt i = 1;
while (op / i > 0) i = i * 10;

do {
i = i / 10;
os << (op / i).to_ullong();
op = op % i;
} while (i > 1);

return os;
}

此代码中使用的逻辑非常简单:如果x = y,并且我将它们都除以10 ^ x,则x仍等于y。使用此属性,我编写了一个代码,用于逐位打印数字。
第一行复制数字,以避免值更改。

    RossInt i = 1;
while (op / i > 0) i = i * 10;
i的初始值为 1,即乘法的中性数。在 while中,它会不断增加 i,直到它变得大于数字的值为止,从而可以知道数字的位数,而无需将其转换为十进制数。

    do {
i = i / 10;
os << (op / i).to_ullong();
op = op % i;
} while (i > 1);

此循环用于实际打印数字。
每次迭代, i都会散为0。用 op除以 i会从 op底部删除与 0一样多的 i数字。例如: 12345 / 100 = 123
之后的操作恰好相反:它保留的位数与 0一样多,而不是删除它们。
然后,此循环将打印一个数字,然后将其全部通过并打印,然后将其删除。

关于c++ - 如何打印大于 `std::bitset`的 `unsigned long long`的十进制值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59957877/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com