【发布时间】:2013-11-21 05:51:07
【问题描述】:
遇到这个算法来计算给定地址的页面偏移量。
//naive solution:
int getAlignedValue(int pageSize, int valueToAlign)
{
int index = valueToAlign/pageSize;
return index * pageSize;
}
//faster solution:
int getAlignedValue_Fast(int pageSize, int valueToAlign)
{
return valueToAlign & (~(pageSize-1));
}
简单的方法简单直观,但更快的解决方案仅适用于页面大小为 2 的幂。例如,
pagesize = 8
address = 30
getAlignedValue(8,30) => 24
getAlignedValue_Fast(8,30) => 24
However, when the pagesize is not a power of 2, such as 10
pagesize = 10
address = 24
getAlignedValue(10,24) => 20
getAlignedValue_Fast(10,24) => 16 //wrong
我的问题是,当页面大小是 2 的幂时,更快的方法使用什么属性,这样valueToAlign & (~(pageSize-1))“碰巧”返回正确的对齐方式,例如24. 换句话说,从一个位的比较中,我只知道它在某种程度上起作用,但不了解它背后的数学。
//leading 0s are ignored
pagesize = 8 => 00001000, address = 30 => 00011110
=>
~(pagesize - 1) = ~(00000111) = > 11111000
=>
00011110
&11111000
----------
00011000 = 24
非常感谢。
【问题讨论】:
标签: bit-manipulation virtual-memory bitmask