2

前の質問へのフォローアップとして:

あなたが uint64_t を持っていて、あなたの各バイトの非上位ビットだけを気にしているとしましょうuint64_t。そのようです:

0111.1111 0111.1111 0111.1111 0111.1111 0111.1111 0111.1111 0111.1111 0111.1111

--->

0000.0000 1111.1111 1111.1111 1111.1111 1111.1111 1111.1111 1111.1111 1111.1111

各セクションをマスクして右にシフトし、次のセクションに追加するよりも、各 7 ビット セクションを右にシフトする高速な方法はありますか?

残念ながら、高速で一般的なビット収集を可能にする最新の AVX 命令はありません。SSE2 命令にしかアクセスできません。

4

1 に答える 1

3

3つのマスクとシフトでそれを行うことができます。

u64 val;

// remove bits at 7, 23, 39, 47
u64 odd8   = val & 0x7f007f007f007f00L;
u64 even8  = val & 0x007f007f007f007fL;

val = ( odd8 >> 1 ) | even8;

// remove bits at 15-16, 23-24
u64 odd16  = val & 0x3FFF00003FFF0000L;
u64 even16 = val & 0x00003FFF00003FFFL;

val = ( odd16 >> 2 ) | even16;

// remove bits at 31-35
u64 odd32  = val & 0x0FFFFFFF00000000L;
u64 even32 = val & 0x000000000FFFFFFFL;

val = ( odd32 >> 4 ) | even32;
于 2012-08-30T18:46:07.683 に答える