c - Bit Hack - 四舍五入为 8 的倍数

标签 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

显然似乎出现了一种已被利用的模式。任何人都可以帮我解决这个问题吗?

谢谢大家的回答。它帮助证实了我的想法。我继续写上面的模式,当我越过 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/

相关文章:

c - 在这种情况下,循环顺序如何影响 C 中的位操作?

C++ 快速高效地对 40 字节数组执行 bit_count 和 AND 运算

c# - 将字节数组转换为位数组?

c - while循环在for循环之后不执行

c - glibc 是否有针对 C 的自动调整大小数组/动态数组实现?

c - time_t 环绕日期

c - UBSAN 报告 : -875 << 7 as undefined behaviour

c - 枚举类型不可用

c - (LKM char设备驱动程序)简单的Linux内核模块,从用户空间到内核空间读写

javascript - 有效地计算 JavaScript 中整数的位数