round_down宏需要解释

时间:2014-03-24 20:26:23

标签: c++ c macros

#define ROUND_DOWN(x, s) ((x) & ~((s)-1))

我不太了解((x) & ~((s)-1))部分。我非常感谢你的解释。

2 个答案:

答案 0 :(得分:4)

因此,可能的用法是:

ROUND_DOWN(152, 128);

让我们来看看会发生什么:

~(128 - 1) == ~(127)
           == ~(0x7F)
           == 0xFFFFFF80

所以,似乎我们正在掩盖数字的低位。

ROUND_DOWN(152, 128) == (152 & 0xFFFFFF80) == 128
ROUND_DOWN(300, 128) == (300 & 0xFFFFFF80) == 256

此外,s也必须是2的幂。否则宏不具备太多的数学意义。

答案 1 :(得分:0)

分手。 〜表示按位 NOT 例如C = 00001100和~C = 11110011。

&安培;是按位 AND 因此,您正在使用!((s)-1)和(x)的值产生的值。

这当然意味着只有在两个值都设置了位时才会设置结果。

例如,将其保持在最低的4位,考虑x = 15和s = 13.

s - 1 = 12 = 0xC - 1100
~(s - 1) = 0011
x & ~(s-1) = 1111 & 0011 = 0011
另一方面,如果x = 14,则得到1110& 0011 = 0010