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)