9

これは、キャリア フェアで NVIDIA の担当者から尋ねられた質問です。

小さくて効率的なコードを記述して、バイト内のビットのすべてのペアを交換します。たとえば、 に10 11 01 10なるはず01 11 10 01です。

for他のすべてのインデックスをループするよりも、これを行うための「効率的な」方法はありますか? 私のコードは小さかったが、これがループよりもどれだけ「効率的」になるかは考えられない... XOR を使用してループを回避する方法があるかもしれないと推測しているが、それはできないそれを理解してください。

ありがとう!

4

6 に答える 6

14

このようなものが動作するはずです

(i >> 1) & 01010101 + (i << 1) & 10101010

i >> 1すべてを 1 ビット右にシフトし、& 01010101偶数位置のビットのみを残します。
2 番目の部分では、同じ形式で奇数ビット位置を扱います。

ただし、それがどれほど効率的かはわかりません。

于 2011-01-25T00:32:59.693 に答える
12

256 エントリのルックアップ テーブルを使用できます。

または、((x & 0x55) << 1) | ((x & 0xAA) >> 1).

于 2011-01-25T00:32:42.500 に答える
2

ルックアップ テーブルを使用しない場合 (または最初に生成する場合) は、次のこともできます。

  • 左シフトおよび左ビット マスク付き AND (10101010)
  • 右シフトおよび右ビット マスク付き AND (01010101)
  • OR 結果は一緒になります。

10 11 01 10

左にシフトすると 01 10 11 00 が 10101010 でマスクされ、00 10 10 00 が得られます

右にシフトされた (元の) は 01 01 10 11 であり、01010101 でマスクされていると、01 01 00 01 が得られます。

または私たちの結果を一緒に

01 11 10 01

したがって、CまたはC ++で行うことができます

unsigned char bitswap( unsigned char uch )
{
   return ((uch<<1) & 0xAA) | (uch>>1) & 0x55 );
}

0x00 から 0xff までのすべての値に対してそれを実行するだけで (ループが終了していることを確認してください!)、「テーブル」を生成します。

于 2011-01-25T15:20:20.303 に答える
1

Java の 32 ビット整数の場合..

public int swapOddEvenbits(int x)
{
   return (  ((x & 0xaaaaaaaa) >> 1 | ((x & 0X55555555) << 1) );

}

64ビットで作業している場合は、マスクを変更する必要があります..

于 2014-07-19T17:52:26.333 に答える
1

テーブル ルックアップ (彼が探していた特定の NVIDA 固有のソリューションがない限り)。

于 2011-01-25T00:32:06.793 に答える
0

1 バイトには 256 通りの組み合わせしかないため、初期の事前計算や総メモリ使用量よりも継続的な実行速度が重要な場合はいつでも、ルックアップ テーブル ベースのソリューションを使用するのに適していると思われます。

例えば:

lookupTable[00000000] = 00000000
lookupTable[00000001] = 00000010
lookupTable[00000010] = 00000001
...
于 2011-01-25T00:34:12.703 に答える