STL源码剖析中有一段代码实现将bytes上调至8的倍数,借鉴了如何将一个数上调至8的倍数这篇博客
enum{__ALIGN=8};
size_t ROUND_UP(size_t bytes)
{
return ((bytes)+__ALIGN-1)&~(__ALIGN-1));
}
这段代码可以这样理解:
首先 __ALIGN=00001000;
则__ALIGN-1=00000111;
~(__ALIGN-1)=11111000;
bytes+__ALIGN-1,如果bytes本身已经是8的倍数,低三位肯定是0, 此时低三分别+1又与0相与,结果仍是bytes本身
如果bytes不是8的倍数,则8n<bytes<8(n+1);
即bytes=8n+q;
bytes+__ALIGN-1=8(n+1)+p; 8(n+1)低三位一定是0,此时低三位代表的数就是p,与0相与消除
((bytes)+__ALIGN-1)&~(__ALIGN-1))=8(n+1);
同理,可以根据该式将bytes上调至2^n的倍数