unsigned int
ビットの異なるセットから抽出する関数を作成します。そのためにマスクを使用したいのですが、そのようなマスクを定義する最良の方法がわかりません。たとえば、ビット 6:14 を抽出する必要があるため、マスクを として定義する必要があります 111111111 << 6
。私の問題は、boost などを使用できないことと、標準の c/c++ が 2 進数で動作することを認識していないことです。できることは、111111111 を 2^10-1 として使用することです。よくわかりません。これが最善の (最もエレガントな) ソリューションです。何かアドバイスはありますか?
4 に答える
ほとんどの人は、0xFF、0x0Aなどのマスクを表すときに16進数を使用します。
まずはたくさん作ってみましょう。
2 進数の N 個の 1 のシーケンスの 1 つの特性は、10 進数の 9 のシーケンスと同様に、それに 1 を追加すると、1 の後に N 個のゼロが続くということです。逆に、N 個のゼロが続く 1 から 1 を引くと、N 個の 1 のシーケンスが得られるという事実を使用して、それを作成できます。
1 の後に N 個のゼロが続く場合は、右に 1 個シフトされた N 桁だけです。
template <typename Uint>
Uint zigamorph(int n) { // http://catb.org/jargon/html/Z/zigamorph.html
return 1 << n - 1; // same as 2^n - 1 :)
}
任意の長さのジガモーフを使用すると、ビットごとの AND を使用して、任意の値から必要なビットを簡単に取得できるようになりました。
template <typename Uint>
Uint mask_bits(Uint value, int first_bit, int last_bit) { // both inclusive?
return value & zigamorph<Uint>(last_bit-first_bit+1);
}
0x1FF << 6
(必要な場合111111111 << 6
) または0x3FF
<< 6
(必要な場合は 2^10-1 << 6)を使用してください。これは、バイナリよりもかなり明確です。Jerry Coffin が指摘しているように、 を使用して 2^10 を簡単に取得できますが1 << 10
、これが 16 進数を使用するよりも明確であるとは確信していません。(さらに言えば、一部のコンテキストで0x7FC00
は、完全に明確な場合があります。ビットが単語のどこにあるかを視覚的に正確に確認できるという利点があり、16 進ダンプがある場合はビットを簡単に選択できます。)
標準ライブラリにアクセスできますか? もしそうなら、私は試してみますstd::bitset
ここにそのドキュメントがあります。