向下舍入 (把123以10为单位向下舍入即120)
- 将 0x12345678 以 0x1000 为单位进行 向下舍入,得到的就应该是 0x12345000
- 以 0x1000 为单位 向下舍入,即 把尾3位 变成 0
- 如果想 把某位变为 0 ,只要进行 与运算
- 0x12345 678 & 0xfffff 000 = 0x12345 000
向上舍入(把123以10为单位向上舍入即130)
- 先 以10为单位 向下舍入,再做个加法(加1个单位)
- \(123 \rightarrow 120 \rightarrow +10 \rightarrow 130\)
- 将 0x12345678 以 0x1000 为单位进行 向上舍入,得到的就应该是 0x12346000
- 0x12345 678 & 0xfffff 000 = 0x12345 000
- 0x12345 000 + 0x1000 = 0x1234 6 000
BUG
if ((i & 0xfff) != 0) { /* 取末3位,判断不为0,则继续 */
i = (i & 0xfffff000) + 0x1000;
}
else
return i;
优化
- 不做判断,直接一步到位
- 不管是否倍数,先加一个 单位取反(~0x1000),再向下舍入
- 0x12345 678 + 0x0 fff = 0x12346 987
- 0x12346 987 & 0xfffff 000 = 0x12346 000
- 用倍数验证
- 0x12345 000 + 0x0 fff = 0x12345 fff
- 0x12345 fff & 0xfffff 000 = 0x12345 000