我有一个数字,我在其上执行特定操作,我想确保该数字在操作后仍可整除。
假设我有一个整数 x 可以被 PAGE_S 整除
这会产生一个整数,它也可以被 PAGE_S 整除?
x^ ~(PAGE_S-1);
所以(x % PAGE_S) == ( (x^ ~(PAGE_S-1)) % PAGE_S)
?据我测试,它有效,但我需要了解为什么......
ps 这是将虚拟内存地址转换为物理地址的代码的一部分
我有一个数字,我在其上执行特定操作,我想确保该数字在操作后仍可整除。
假设我有一个整数 x 可以被 PAGE_S 整除
这会产生一个整数,它也可以被 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 操作 (^) 将翻转第一个操作数中第二个操作数中对应位为 1 的任何位;例如,101101 ^ 111000 是 010101,因为前三位被翻转。
由于x
可被 整除PAGE_S
,因此最后 k 位必须为零。由于 的最后 k 位~(PAGE_S-1)
也为零,因此 的最后 k 位x^~(PAGE_S-1)
为零,因此可以被 整除PAGE_S
。这也会反转 的所有其他位x
。