我想以下列格式打印64位十六进制数据:
0x1111_2222_3333_4444
我可以想到以下几点:
#define FIRST_MASK 0xFFFF000000000000
#define SECOND_MASK 0x0000FFFF00000000
#define THIRD_MASK 0x00000000FFFF0000
#define FOURTH_MASK 0x000000000000FFFF
val = 0x1111222233334444
printf("0x%04x_%04x_%04x_%04x\n", \
(unsigned int)((val & FIRST_MASK) >> 48),
(unsigned int)((val & SECOND_MASK) >> 32),
(unsigned int)((val & THIRD_MASK) >> 16),
(unsigned int)(val & FOURTH_MASK)
);
有没有简单(或者更干净)的方法来实现这个目标?
答案 0 :(得分:11)
位移始终是最好的方法,因为它们既快又独立于平台。但是,你的代码是不必要的复杂:你可以在转移之后而不是之前进行掩码。
#include <stdint.h>
#include <stdio.h>
int main (void)
{
uint64_t val = 0x1111222233334444;
printf("0x%04x_%04x_%04x_%04x\n",
(unsigned int)(val>>48 & 0xFFFF),
(unsigned int)(val>>32 & 0xFFFF),
(unsigned int)(val>>16 & 0xFFFF),
(unsigned int)(val>> 0 & 0xFFFF) );
}