0

特定の操作を実行する数値があります。操作後も数値が割り切れることを確認したいです。

PAGE_S で割り切れる整数 x があるとします。

これは PAGE_S で割り切れる整数を生成しますか?

x^ ~(PAGE_S-1);

それで(x % PAGE_S) == ( (x^ ~(PAGE_S-1)) % PAGE_S)?私がテストした限りでは動作しますが、その理由を理解する必要があります...

psこれは、仮想メモリアドレスを物理アドレスに変換するコードの一部です

4

1 に答える 1

2

はい。ただし、 がPAGE_S2 のべき乗である場合に限ります。

PAGE_Sが 2 のべき乗 (たとえば 2 k ) の場合、そのバイナリ表現は 1 の後に k 個の 0 が続きます。したがって、PAGE_S-1バイナリでは k 1 になり、~(PAGE_S-1)すべて 1 の後に k 0 が続きます。

xor 演算 (^) は、第 2 オペランドの対応するビットが 1 である第 1 オペランドのビットを反転します。たとえば、101101 ^ 111000 は、最初の 3 ビットが反転されるため、010101 になります。

xは で割り切れるのでPAGE_S、最後の k ビットはゼロでなければなりません。の最後の k ビット~(PAGE_S-1)も 0 であるため、 の最後の k ビットx^~(PAGE_S-1)は 0 であり、 で割り切れPAGE_Sます。これは、 の他のすべてのビットも反転しますx

于 2012-08-24T04:57:32.370 に答える