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倍数