C++ 需要对向下取整宏进行解释
在C++ 需要对向下取整宏进行解释,c++,c,macros,C++,C,Macros,在 我不太理解这个部分((x)和((s)-1))。我非常感谢您的解释。因此,这一用法可能是: #define ROUND_DOWN(x, s) ((x) & ~((s)-1)) 让我们看看发生了什么: ROUND_DOWN(152, 128); 所以,我们似乎掩盖了一个数字的低位 ~(128 - 1) == ~(127) == ~(0x7F) == 0xFFFFFF80 另外,s也必须是2的幂。否则宏在数学上就没有多大意义。因此,它的一个
我不太理解这个部分
((x)和((s)-1))
。我非常感谢您的解释。因此,这一用法可能是:
#define ROUND_DOWN(x, s) ((x) & ~((s)-1))
让我们看看发生了什么:
ROUND_DOWN(152, 128);
所以,我们似乎掩盖了一个数字的低位
~(128 - 1) == ~(127)
== ~(0x7F)
== 0xFFFFFF80
另外,
s
也必须是2的幂。否则宏在数学上就没有多大意义。因此,它的一个可能用法是:
#define ROUND_DOWN(x, s) ((x) & ~((s)-1))
让我们看看发生了什么:
ROUND_DOWN(152, 128);
所以,我们似乎掩盖了一个数字的低位
~(128 - 1) == ~(127)
== ~(0x7F)
== 0xFFFFFF80
另外,
s
也必须是2的幂。否则宏在数学上就没有多大意义。将其分解。~表示按位不因此,例如C=00001100和~C=11110011
&是按位的和,因此您将与生成的值相加!((s)-1)和(x)的值
这当然意味着只有在两个值中都设置了位时,结果才会设置位
例如,将其保持在最低的4位,考虑x=15和s=13。
ROUND_DOWN(152, 128) == (152 & 0xFFFFFF80) == 128
ROUND_DOWN(300, 128) == (300 & 0xFFFFFF80) == 256
另一方面,如果x=14,则得到1110&0011=0010表示按位不因此,例如C=00001100和~C=11110011 &是按位的和,因此您将与生成的值相加!((s)-1)和(x)的值 这当然意味着只有在两个值中都设置了位时,结果才会设置位
例如,将其保持在最低的4位,考虑x=15和s=13。
ROUND_DOWN(152, 128) == (152 & 0xFFFFFF80) == 128
ROUND_DOWN(300, 128) == (300 & 0xFFFFFF80) == 256
另一方面,如果x=14,则得到1110&0011=0010它使用位掩码从
x
中切掉较低的log2
位。我从未见过这个宏,它要求s
是二的幂?@MooingDuck,是的,s
必须是2的幂才能使宏有意义。@Richard J.Ross III:正确。这有效地将x向下舍入到sIt的下一个较低倍数,使用位掩码从x
切掉较低的log2(s)
位。我从未见过这个宏,它要求s
是二的幂?@MooingDuck,是的,s
必须是2的幂才能使宏有意义。@Richard J.Ross III:正确。这有效地将x向下舍入到下一个较低的s倍数