ビット論理演算を使用してビットベクトルを実現
1831 ワード
ビット論理演算を用いてビットベクトルを実現することは,ビットベクトルの設定,クリア,プローブの3つの動作を実現することを指す.
コードは次のとおりです.
このコードにはビット論理演算があまり使われていて、よく読めません.
i>>shiftこれは実はiを32で割った、つまり2^5です.目的はiが配列中のどの位置を特定することである.
1<<(i&mask)i&maskまず左に移動すべきビット数を算出し、それから1を左にこんなに多く移動し、残りは配列中の要素と演算したり、演算したりします.
実はこのいくつかの文をこのように変えてもっとよく理解します.
ビットベクトルは、特定の大量のデータ処理アプリケーション(検索、ソートなど)では、パフォーマンスとメモリの利点があります.
コードは次のとおりです.
private const int bitsPerWord = 32;
private const int shift = 5;
private const int mask = 0x1F;
private const int n = 10000000;
private static readonly int[] a = new int[1 + n / bitSperWord];
void set(int i)
{
a[i >> shift] |= (1 << (i & mask));
}
void clr(int i)
{
a[i >> shift] &= ~(1 << (i & mask));
}
int test(int i)
{
return a[i >> shift] & (1 << (i & mask));
}
我々が実現する機能は、整数(32ビット)配列を与え、パラメータiを入力し、配列のiビットを1、またはiビットをゼロにするか、またはiビットの値を検出することである.このコードにはビット論理演算があまり使われていて、よく読めません.
i>>shiftこれは実はiを32で割った、つまり2^5です.目的はiが配列中のどの位置を特定することである.
1<<(i&mask)i&maskまず左に移動すべきビット数を算出し、それから1を左にこんなに多く移動し、残りは配列中の要素と演算したり、演算したりします.
実はこのいくつかの文をこのように変えてもっとよく理解します.
void set(int i)
{
a[i / 32] |= (1 << (i % 32));
}
void clr(int i)
{
a[i / 32] &= ~(1 << (i % 32));
}
int test(int i)
{
return a[i / 32] & (1 << (i % 32));
}
ビットベクトルは、特定の大量のデータ処理アプリケーション(検索、ソートなど)では、パフォーマンスとメモリの利点があります.