需要知道操作后数字是否可以被整除

时间:2012-08-24 04:41:53

标签: c virtual-memory integer-division

我有一个号码,我在其上执行特定操作 我想确保操作后该数字仍然可以分割。

假设我有一个可被PAGE_S

整除的整数x

这会产生一个整数,它也可以被PAGE_S整除吗?

x^ ~(PAGE_S-1);

所以(x % PAGE_S) == ( (x^ ~(PAGE_S-1)) % PAGE_S)? 据我测试,它有效,但我需要理解为什么......

p.s这是将虚拟内存地址转换为物理地址的代码的一部分

1 个答案:

答案 0 :(得分:2)

是的,但前提是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位必须为零。由于~(PAGE_S-1)的最后k位也为零,x^~(PAGE_S-1)的最后k位为零,因此可被PAGE_S整除。这也会反转x的所有其他位。