gpt4 book ai didi

c++ - 使用 std::cout 打印零填充十六进制

转载 作者:IT老高 更新时间:2023-10-28 21:45:26 29 4
gpt4 key购买 nike

假设我有一个双字,我想用 std::cout 和左填充零输出十六进制,所以 0xabcd 将显示为 0x0000abcd。看来您必须这样做:

uint32_t my_int = 0xabcd;

std::cout << "0x" << std::hex << std::setw(8) << std::setfill('0')
<< my_int << std::endl;

这对于可以在 C 中使用 printf("0x%08X\n", my_int); 完成的事情来说似乎很荒谬。有什么办法可以缩短这个时间,同时仍然使用 std::cout 进行输出(除了使用命名空间 std)?

最佳答案

我想你可以写一个“流操纵器”。如果您有多个要以这种格式打印的十六进制数字,这很有用。这显然不是一个理想的解决方案,但使用包装器类型,您可以制作自己的“格式标志”来切换它。见 Sticky custom stream manipulator了解更多信息。

#include <iostream>
#include <iomanip>

static int const index = std::ios_base::xalloc();

std::ostream& hexify(std::ostream& stream) {
stream.iword(index) = 1;
return stream;
}

std::ostream& nohexify(std::ostream& stream) {
stream.iword(index) = 0;
return stream;
}

struct WrapperType {
uint32_t _m;
public:
WrapperType(uint32_t m) : _m(m)
{
}

uint32_t getm() const
{
return _m;
}
};
std::ostream& operator<< (std::ostream& os, const WrapperType& t) {
if (os.iword(index))
return os << "0x" << std::hex << std::setw(8) << std::setfill('0') << t.getm();
else
return os << t.getm();
}

int main()
{
WrapperType my_int{0xabcd};
std::cout << hexify << my_int << my_int;
std::cout << nohexify << my_int;
}

关于c++ - 使用 std::cout 打印零填充十六进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21416425/

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