3

QTにはqint64があります。これをint8_tのサイズに分割する簡単な方法はありますか?

明確にするために、私が持っていた場合

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

入手したい

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

3 に答える 3

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

于 2012-11-12T16:54:38.290 に答える
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ビット整数で処理されるようにしてください。

于 2012-11-12T16:32:02.427 に答える
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;
于 2012-11-12T17:05:11.273 に答える