谁能解释一下这是如何工作的 (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
显然似乎出现了一种已被利用的模式。任何人都可以帮我解决这个问题吗?
谢谢大家的回答。它帮助证实了我的想法。我继续写上面的模式,当我越过 10 时,我可以清楚地看到 nos 被提升到下一个“8 block ”,如果我可以这么说的话。
再次感谢。
最佳答案
好吧,如果您尝试四舍五入,则不需要添加。只需执行屏蔽步骤就会清除底部位,您将四舍五入到下一个较低的倍数。
如果您想向上舍入,首先您必须添加足够的量以“超过”下一个 8 的倍数。然后相同的掩码步骤将您返回到 8 的倍数。你选择 7 的原因是,如果你的原始数字已经是 8 的倍数,它是唯一一个保证“足够大”的数字,可以让你从任何数字上升到下一个 8 的倍数,而不会再增加一个额外的倍数。
一般来说,四舍五入为二的幂:
unsigned int roundTo(unsigned int value, unsigned int roundTo)
{
return (value + (roundTo - 1)) & ~(roundTo - 1);
}
关于c - Bit Hack - 四舍五入为 8 的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1766535/