alicemare / ideas

用Issue来记录一些简单的笔记?
0 stars 0 forks source link

一些神奇的算法和技巧 #13

Open alicemare opened 5 years ago

alicemare commented 5 years ago

在看一个内存管理malloc的实现的时候 要求内存分配做到4k对齐,也就是要求size是8的倍数 所以我们可以实现为:

size_t align8(size_t s) {
    if(s & 0x7 == 0)
        return s;
    return ((s >> 3) + 1) << 3;
}

如果某个数是8的倍数,那么它模8之后,余下的三位范围是二进制的000到111,而7正好是111,所以只要让这个数与7按位求与,结果是0,那么就代表是8的倍数 否则,右移3位,加上一,得到这个数除以8之后大于这个数的最小整数,再左移8位,也就得到了大于这个数且最小的8的倍数