特定の操作を実行する数値があります。操作後も数値が割り切れることを確認したいです。
PAGE_S で割り切れる整数 x があるとします。
これは PAGE_S で割り切れる整数を生成しますか?
x^ ~(PAGE_S-1);
それで(x % PAGE_S) == ( (x^ ~(PAGE_S-1)) % PAGE_S)
?私がテストした限りでは動作しますが、その理由を理解する必要があります...
psこれは、仮想メモリアドレスを物理アドレスに変換するコードの一部です
特定の操作を実行する数値があります。操作後も数値が割り切れることを確認したいです。
PAGE_S で割り切れる整数 x があるとします。
これは PAGE_S で割り切れる整数を生成しますか?
x^ ~(PAGE_S-1);
それで(x % PAGE_S) == ( (x^ ~(PAGE_S-1)) % PAGE_S)
?私がテストした限りでは動作しますが、その理由を理解する必要があります...
psこれは、仮想メモリアドレスを物理アドレスに変換するコードの一部です
はい。ただし、 がPAGE_S
2 のべき乗である場合に限ります。
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
。