我有一个号码,我在其上执行特定操作 我想确保操作后该数字仍然可以分割。
假设我有一个可被PAGE_S
整除的整数x这会产生一个整数,它也可以被PAGE_S整除吗?
x^ ~(PAGE_S-1);
所以(x % PAGE_S) == ( (x^ ~(PAGE_S-1)) % PAGE_S)
?
据我测试,它有效,但我需要理解为什么......
p.s这是将虚拟内存地址转换为物理地址的代码的一部分
答案 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
的所有其他位。