0

論理 OR を使用してバイト内の任意のビットを設定し、論理 AND を使用して任意のビットをクリアできることを知っています。

    val |= (1<<order_number_of_bit_to_set);   //for setting some specific number of bit 

そして少しクリアするために

    val &= ~(1<<order_number_of_bit_to_clear); // specific bit to clear

しかし、私の質問は、バイトに設定されているビットの数と順序を確認するにはどうすればよいかということです。

たとえば、

    val = 0x22;

2番目と5番目のビットがバイトに設定されていることを意味します

これを行うための効率的で迅速かつ最短の方法は何ですか?

頭に浮かんだ簡単な解決策は、すべてのビットを反復処理して順序を確認し、レコードが設定されているかどうかを確認して、ビットの順序を表示することです。

しかし、これを行うための他の効率的な方法はありますか?

4

4 に答える 4

0

on ビットのカウントは、少し最適化される場合があります。

int bits_on(int x)
{
   x = (x & 0x55555555) + ((x>>1) & 0x55555555);
   x = (x & 0x33333333) + ((x>>2) & 0x33333333);
   x = (x & 0x0F0F0F0F) + ((x>>4) & 0x0F0F0F0F);
   x = (x & 0x00FF00FF) + ((x>>8) & 0x00FF00FF);
   x = (x & 0x0000FFFF) + ((x>>16) & 0x0000FFFF);
   return x;
}

ただし、位置はループで見つける必要があります。(それは他の人の答えにあります。)

于 2013-10-01T12:54:43.853 に答える
0

上記の@ 0x499602D2の回答から変更:

int pos[sizeof(/* decltype(val) */)];
int bits_on = 0;
for (int i = sizeof(/* decltype(val) */) * CHAR_BIT - 1; --i;)
{
    pos[i] = (val >> i) & 1;
    if(pos[i]) bits_on++;
}  

合計と位置を示します。

于 2013-10-01T01:24:09.543 に答える
0

以下は 2 つのアルゴリズムの組み合わせで、設定されたビットの数だけ反復します。

unsigned count_low_zerobits(unsigned n) {
    static const unsigned MultiplyDeBruijnBitPosition[32] =
    {
        0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
        31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
    };
    return MultiplyDeBruijnBitPosition[((n & -n) * 0x077CB531U) >> 27];
}

unsigned find_bits(unsigned n, unsigned positions[]) {
    unsigned c;
    for (c = 0; n; c++) {
        unsigned bitnum = count_low_zerobits(n); // get bit number of lowest bit
        positions[c] = bitnum; // put number to positions array
        n ^= 1 << bitnum; // use XOR to unset just this one bit
    }
    return c;
}

詳細については、以下を参照してくださいcount_low_zerobits:質問の回答設定されている最下位ビットの位置

次に、関数find_bitsはこれを呼び出し、指定されたビット位置を結果配列に置き、それを使用して、ビットごとの排他的論理和を使用してこのビットの設定を解除します。

最後に、便宜上、これをテストするために使用した醜いコードの一部を示します。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    unsigned positions[128] = {0};
    int testnumber = 4442344;

    unsigned count = find_bits(testnumber, positions);

    // non-standard, leaking one-liner for debug purposes, remove if fails to compile:
    printf ("Number in binary: %s\n", itoa(testnumber, malloc(129), 2));

    printf("%u bits: ", count);
    for(unsigned i = 0 ; i < count ; ++i) {
        printf("%u ", positions[i]);
    }
    printf("\n");

    return 0;
}
于 2013-10-01T13:44:59.237 に答える