0

コードで大きな数値 (128 ビット以上の整数) を使用しています。c++ には std::bitset がいくつかの操作を単純にするため、データをいくつかの整数に分割する必要がないことがわかりました。しかし、すぐに別の問題が見つかりました。いくつかの (長い) 整数をビットセットに変換する必要がある場合、それを行う最善の方法は何ですか? たとえば、4 つの long 整数 (それぞれ 32 ビット) を 128 ビットのビットセットに変換しようとしていますが、次の方法は機能しません。各整数に対して (シフト操作は 32 未満のシフトされたビットに対してのみ機能します)

std::bitset<256> b;
unsigned long v1=2, v2=9, v3=19, v4=1021;
b |= v1 | (v2<<32) | (v3<<64) | (v4<<128);

現在、for ループを使用してビットセットの各ビットを設定していますが、より効率的でエレガントな方法を探しています。

4

2 に答える 2

2

これは最良の選択肢ではないかもしれませんが、これはどうでしょうか。

typedef std::bitset<256> bs256;
b |= bs256(v1) | (bs256(v2) << 32) | (bs256(v3) << 64) | (bs256(v4) << 128);
于 2012-04-15T03:45:39.270 に答える
0

ループで少しずつ設定する必要があるかもしれません:

int v[4]; //< keep your bitmasks in an array
int nbits = 8 * sizeof(v[0]);
for(int i = 0; i < 128; ++i) {
  int t = v[i / nbits];
  bit.set(i, t & (1 << (i % nbits)));
}

bitset別の方法は、個々のビットだけでなく、ビットセット全体を任意の位置に設定できるクラスを派生させることです。

于 2012-04-15T03:44:03.987 に答える