1

この質問のタイトルが示すように、整数 (特に 64 ビット符号なし) 内でビットのブロックを混合する最良の方法を知りたい

たとえば、私は 8 ビットの整数を持っています。ここで、ビットは 0000 1111 で、4 ビットを 4 ビットで混ぜます = 0101 0101

例 2: 0010 0110
0 1 1 0 右 0.0.1.0 左 = 00011100 4 ビットを 4 ビットずつ混合 = 0001 1100 簡単には、 . 右ブロックのビットで満たされた場所

私が今していること:

uint64_t mix32(uint64_t v) {
    uint64_t ret=0;
    int x=0;
    for(int i=0; i<32; i++) {
        setbit(ret, x, getbit(v, i));
        x++;
        setbit(ret, x, getbit(v, i+32));
        x++;
    }

    return ret;
}

setbit は、特定の位置のビットを設定またはクリアするマクロです。正確に必要な のは、各 32 ビットを次の 32 ビットと混合する、各 16 ビットを次の 16 ビットと混合する、各 16 ビットを次の 16 ビットと混合する、各 8 ビットを次の 8 ビットと混合する などです。私はグーグルでよく見ましたが、そのようなシナリオを示さないチュートリアルで終わりました。

元気でね。

4

4 に答える 4

3

いくつかの解決策については、「ビットのインターリーブ」セクションのビットをいじるハックを参照してください。

于 2010-08-27T14:47:13.130 に答える
0

この小さな操作に多くの時間を費やすのは良くありませんでしたが、ちょっとしたハックから解決策を見つけました。これを行うには多くの良い方法があるに違いないと確信していますが、研究に集中し続けることができる解決策が必要でした.それは間違いなく最悪の方法です.

uint64_t mix32(uint64_t v, bool right_even=true) {
    unsigned uint32_t x;   // Interleave bits of x and y, so that all of the
    unsigned uint32_t y;   // bits of x are in the even positions and y in the odd;
    unsigned uint64_t z = 0; // z gets the resulting Morton Number.

    if(right_even)
        v = swap32(v); //swap 32bit blocks

    char *n = (char*)malloc(sizeof(v));
    memcpy(n, &v, sizeof(v));
    memcpy(&y, n, sizeof(y));
    memcpy(&x, n+sizeof(x), sizeof(x));

    for (int i = 0; i < sizeof(x) * 8; i++) // unroll for more speed...
       z |= (x & 1ULL << i) << i | (y & 1ULL << i) << (i + 1);

    return z;
}

元気でいてください。

于 2010-08-27T15:24:19.320 に答える
0
unsigned __int64 mix32(unsigned __int64 v, bool right_even=true) {
    unsigned __int64 z = 0; 

    if(right_even)
        v = swap32(v);

    unsigned __int32 x = (v&0xffffffffUL);
    unsigned __int32 y = (v&0xffffffffUL)>>32;

    for (int i = 0; i < sizeof(x) * 8; i++) 
       z |= (x & 1ULL << i) << i | (y & 1ULL << i) << (i + 1);

    return z;
}
于 2010-08-29T06:56:48.420 に答える
0

私がすることは、多重操作のために各ニブルを拡張した結果を保持する 16 要素のテーブルを持つことです。次に、必要に応じて 1 を左シフトし、結果をビットごとに並べ替えます。

于 2010-08-27T14:33:15.777 に答える