2012-11-12 57 views
3

在QT中,我有一个qint64。有没有简单的方法将它分成大小为int8_t的块?获取qint64的最高有效字节

为清楚起见,如果我有一个

qint64 a = [11001000 00001111 11110000 ... 11001100] 

我想获得

int8_t a1=[11001000] 
int8_t a2=[00001111] 
int8_t a3=[11110000] 
... 
int8_t a8=[11001100] 

回答

6

这是一个比Qt更多的C/C++问题。但不管怎么说:

qint64 a = 56747234992934; 
union { 
    qint64 i64; 
    int8_t i8[8]; 
} u = {a}; 
#if Q_BYTE_ORDER == Q_BIG_ENDIAN 
qDebug() << u.i8[0]; // MSB is the first byte on big endian machines 
#else 
qDebug() << u.i8[7]; // MSB is the last byte on little endian machines 
#endif 

编辑:为了避免凌乱端具体位置代码:

qint64 a = 56747234992934; 
union { 
    qint64 i64; 
    int8_t i8[8]; 
} u = {qToBigEndian(a)}; 
qDebug() << u.i8[0]; // MSB is the first byte on big endian machines 

注意,你需要包括qendian.h这个工作。

+0

丑陋,但可能是最快的解决方案,如果价值将存储无论如何。 – hirschhornsalz

+0

不利的一点是,在访问一个字节之前,你必须总是检查字节序。如果你想要第三个有意义的字节,取决于机器,它可以是u.i8 [2]或u.i8 [5]。根据您需要访问这些字节的频率,这可能会很快导致代码混乱。 – Fred

+0

是的。但很容易避免。看我的编辑。 –

2
int8_t a1 = a & 0xff00000000000000ll >> 56; 
int8_t a2 = a & 0x00ff000000000000ll >> 48; 
int8_t a3 = a & 0x0000ff0000000000ll >> 40; 
int8_t a4 = a & 0x000000ff00000000ll >> 32; 
int8_t a5 = a & 0x00000000ff000000ll >> 24; 
int8_t a6 = a & 0x0000000000ff0000ll >> 16; 
int8_t a7 = a & 0x000000000000ff00ll >> 8; 
int8_t a8 = a & 0x00000000000000ffll; 

确保追加ll到您的常量,使他们在64位整数处理。

+0

或者你可以做移位第一和屏蔽。这样掩码总是0xFF。 –

+0

@StephenChu如果使用'int8_t',则根本不需要任何掩码。这是C,而不是Java或某些东西;-) – hirschhornsalz

+0

@Fred:您可以完全省略掩码。 -1。 – hirschhornsalz

1

这是一个破坏性的解决方案。它破坏了a的内容,也许破坏了一些粗心的代码评论者的脑组织。这也是美观。

int8_t a8 = a; 
int8_t a7 = a >>= 8; 
int8_t a6 = a >>= 8; 
int8_t a5 = a >>= 8; 
int8_t a4 = a >>= 8; 
int8_t a3 = a >>= 8; 
int8_t a2 = a >>= 8; 
int8_t a1 = a >>= 8; 

更好的解决方案,可能在性能和可读性和保存的内容:

int8_t a8 = a; 
int8_t a7 = a >> 8; 
int8_t a6 = a >> 16; 
int8_t a5 = a >> 24; 
int8_t a4 = a >> 32; 
int8_t a3 = a >> 40; 
int8_t a2 = a >> 48; 
int8_t a1 = a >> 56; 
相关问题