在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]
在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]
這是一個比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
這個工作。
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位整數處理。
或者你可以做移位第一和屏蔽。這樣掩碼總是0xFF。 –
@StephenChu如果使用'int8_t',則根本不需要任何掩碼。這是C,而不是Java或某些東西;-) – hirschhornsalz
@Fred:您可以完全省略掩碼。 -1。 – hirschhornsalz
這是一個破壞性的解決方案。它破壞了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;
醜陋,但可能是最快的解決方案,如果價值將存儲無論如何。 – hirschhornsalz
不利的一點是,在訪問一個字節之前,你必須總是檢查字節序。如果你想要第三個有意義的字節,取決於機器,它可以是u.i8 [2]或u.i8 [5]。根據您需要訪問這些字節的頻率,這可能會很快導致代碼混亂。 – Fred
是的。但很容易避免。看我的編輯。 –