5

C では、アドレスを表す 32 ビット ワードがあります (それを unsigned long に格納していますが、問題ないことを願っています)。私が収集したものから、アドレスの一部にはページ番号が含まれ、他の部分にはオフセットが含まれています。ページ番号を与えるビットだけを抽出する方法を考えていました。最初の最上位 22 ビットがページ番号で、残りの 10 ビットがページ オフセットであることは既にわかっています。ページ番号のビットだけを取得するにはどうすればよいですか? ビット単位の操作でこれを行うことができると考えていますが、方法がわかりません。

4

2 に答える 2

11

bitshift演算子を使用して、必要なビットを抽出します。

pageNumber = x >> 10;
offset = x & ((1 << 10) - 1);

ページ番号の場合、 >> 演算子はビットを下にシフトするため、最下位ビットが失われます。

オフセットの場合、((1 << 10) - 1) は、10 個の 1 で構成されるビットマスクを作成します。これは、最下位 10 ビットのみを選択し、最上位ビットを無視するために使用されます。

于 2009-11-29T22:45:33.773 に答える
2

私はフィールド抽出の「2 シフト」方式の大ファンです。署名付きと未署名の両方で機能します。からw最下位ビットを含む幅のフィールドを抽出するには:lsbword

#define BITSIN(W) (8*sizeof(W))
return (word << (BITSIN(word) - (lsb+width))) >> (BITSIN(word) - width);

この場合、BITSIN(word) == 32and lsb+width == 32、したがって、問題の単語が符号なしである限り、マスキングせずに右に 10 シフトするだけで済みます。

1 つの注意: 32 ビット型での 32 ビット シフトに注意してください。C 標準では、コンパイラーは何でもできますが、一般的な Intel チップが行うことは役に立ちません: ビット単位で左にx << yシフトします ( 32 ビット整数型がある場合)。これは、32 ビット整数を左または右に 32 ビットシフトしようとすると、結果はノーオペレーションと同じになることを意味します。64 ビット型の 64 ビット シフトにも同様の問題があります。xy % 32x

于 2009-11-30T00:32:58.557 に答える