有很多关于使用C++流表达十六进制格式的变量时,如何填充固定数量的前导零的问题:(参考链接)
std::cout << std::hex << setfill('0') << setw(8) << myByteSizedVar;
我的问题是如何对非固定宽度进行操作,而是按某个固定量的倍数操作 - 很可能是8,因为当比较输出时我们可能希望:
0x87b003a
0xab07
为了便于比较宽度(虽然顶部更大,但是你尝试在脑海中进行按位比较?很容易混淆),可以进行宽度匹配。
0x87b003a
0x000ab07
不错,两个字节排列整齐美观。但我们只看到了7位——这并不是立即显而易见的(特别是如果是15/16、31/32等),可能导致我们误将上方视为负数(假定有符号)。
好的,我们可以像上面那样将宽度设置为8。
然而,当与一个32位字对比时:
0x000000000000000000000000087b003a
0x238bfa700af26fa930b00b130b3b022b
这取决于用途,如果处理的是硬件,其中顶部数字实际上没有32位字的上下文环境,那么它可能更加不必要,甚至会产生误导。
我想要的是自动将数字的宽度设置为8的倍数,例如:
std::cout << std::hex << std::setfill('0') << setWidthMultiple(8) << myVar;
例如以下结果:
0x00000000
0x388b7f62
0x0000000f388b7f62
这个怎么用标准库或最少的代码实现?没有像
Boost.Format
这样的东西。
myVar
并返回所需的数字位数。 - Kerrek SB