Bit Hack - 四舍五入到8的倍数

use*_*721 9 c bit-manipulation

任何人都可以解释这是如何工作的(asz + 7)&〜7; 它将asz舍入到8的下一个更高倍数.

这是很容易看到,〜7产生11111000(8位表示),因此关断最后3位,因此其产生的任何数目是8的倍数.

我的问题是如何在屏蔽[edit]之前将asz添加到7以产生8的下一个更高[end edit]倍数?我试着在纸上写下来

喜欢 :

1 + 7 = 8  = 1|000 (& ~7) -> 1000
2 + 7 = 9  = 1|001 (& ~7) -> 1000
3 + 7 = 10 = 1|010 (& ~7) -> 1000
4 + 7 = 11 = 1|011 (& ~7) -> 1000
5 + 7 = 12 = 1|100 (& ~7) -> 1000
6 + 7 = 13 = 1|101 (& ~7) -> 1000
7 + 7 = 14 = 1|110 (& ~7) -> 1000
8 + 7 = 15 = 1|111 (& ~7) -> 1000
Run Code Online (Sandbox Code Playgroud)

似乎已经出现了一种被剥削的模式.任何人都可以帮助我吗?

谢谢大家的答案.这有助于确认我的想法.我继续写上面的模式,当我越过10时,我可以清楚地看到,如果我可以这么说,那么nos会被提升到下一个"8块".

再次感谢.

Car*_*rum 17

好吧,如果你试图向下舍入,你就不需要添加了.只需执行屏蔽步骤就可以清除底部位,然后将四舍五入到下一个较低的位数.

如果你想要向上舍入,首先你必须添加足够的"过去"下一个8的倍数.然后相同的屏蔽步骤将你带回到8的倍数.你选择7的原因是它是唯一的数字如果您的原始数字已经是8的倍数,那么保证"足够大"可以让您从8的下一个倍数上升到任何数字而不会增加额外倍数.

一般来说,要达到两个幂:

unsigned int roundTo(unsigned int value, unsigned int roundTo)
{
    return (value + (roundTo - 1)) & ~(roundTo - 1);
}
Run Code Online (Sandbox Code Playgroud)


Bro*_*oam 16

它实际上增加7至数和四舍五入下来.

这具有向上舍入到8的下一个倍数的期望效果.(添加+8而不是+7将使值8到16).


小智 5

+7 不是产生 8 的精确倍数,而是确保你得到 8 的次高倍数。

编辑:被 16 秒和几个质量订单击败。哦,好吧,回到潜伏状态。