在
#define ROUND_DOWN(x, s) ((x) & ~((s)-1))
我不太了解((x) & ~((s)-1))
部分。我非常感谢你的解释。
答案 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