1

、、が からまでのビットを表す符号なし整数N = abcdがあります。次の数字を取得したいabcdmsblsb

x1 = ab0cd
x2 = ab1cd

Cでビット単位の操作を使用してそれを行う最速の方法は何ですか?

私が今しようとしているのは次のとおりです

unsigned int blockid1 = N>>offset;
unsigned int key1 = (blockid<<(1+offset))|(((1<<offset)-1)&N);
unsigned int key2 = (key1)|(1<<offset);

0ここでオフセットは、挿入したい場所です1

4

3 に答える 3

1
const unsigned int mask = (~0) << offset;  // same as -(2**offset)
unsigned int key1 = N + (N & mask);
unsigned int key2 = key1 - mask;
于 2012-09-22T16:33:33.933 に答える
0

ビット順列に関する Jasper Neumann のページを参照してください。これには、オンライン コード ジェネレーターが含まれています。ただし、特定のケースでは非常に複雑になる場合があります (0 または 1 を MSB と見なす場合の 1 ビットの置換)。

注: アドレスにはドメイン名がなく、SO では直接の IP が許可されていないため、アドレスをググらせてください。

于 2012-09-17T08:56:59.940 に答える
0

入力は 4 ビット幅しかないため、合計で 16 個の出力しかないため、少なくともルックアップ テーブルのテスト (つまり、実装とプロファイリング) をお勧めします。

最近では、超高速の ALU と低速の (っぽい) メモリを使用して、ルックアップが高速であるとは限りませんが、常にテストする価値があります。テーブルが小さいということは、キャッシュがあまり汚染されないことを意味し、一連の算術命令よりも高速になる可能性があります。

出力も非常に小さいため、完全なテーブルは次のように表すことができます。

const static uint8_t keys[16][2];

32 バイトは非常に小さく、これを頻繁に行う (つまり、タイトなループで連続して何度も行う) と、テーブルは完全にキャッシュに収まるはずです。

于 2012-09-17T08:39:00.833 に答える