围捕?它有什么作用?在C ++中

时间:2010-01-21 04:28:02

标签: c++

有人可以向我解释这是做什么的吗?

#define ROUNDUP(n,width) (((n) + (width) - 1) & ~unsigned((width) - 1))

4 个答案:

答案 0 :(得分:6)

提供宽度是2的偶数幂(所以2,4,8,16,32等),它将返回一个等于或大于n的数字,这是宽度的倍数,这是最小值达到这个标准。

所以宽度= 16; 5-> 16,8-> 16,15-> 16,16-> 16,17-> 32,18-> 32等。

编辑我开始提供解释为什么这样做的原因,因为我觉得这真的是OP想要的,但它变成了一个相当复杂的故事。如果OP仍然困惑,我建议通过一些简单的例子,比如width = 16,n = 15,16,17。请记住& =按位AND,〜=按位补码,并在处理示例时专门使用二进制表示。

答案 1 :(得分:2)

它将n向上舍入到下一个'宽度' - 但我认为宽度必须是2的幂。

例如width == 8,n = 5:

(5 + 8 - 1)& 〜(7) = 12& 〜7 = 8

所以5轮到8轮。任意1到8轮到8. 9到16轮到16.等等(0轮到0)

答案 2 :(得分:2)

它定义了一个名为ROUNDUP的宏,它带有两个参数nwidth,并返回值(n + width - 1) & ~unsigned(width - 1)

:)

如果你认为你知道它的作用,试试这个:

std::string s("WTF");
std::complex<double> c(-11,5);
ROUNDUP(s, c);

答案 3 :(得分:0)

由于C,它无法在unsigned中使用。只要width仅限于2的幂,就可以做到这一点:

 n width ROUNDUP(n,width)
----------------
 0   4    0
 1   4    4
 2   4    4
 3   4    4
 4   4    4
 5   4    8
 6   4    8
 7   4    8
 8   4    8
 9   4    12
10   4    12
11   4    12
12   4    12
13   4    16
14   4    16
15   4    16
16   4    16
17   4    20
18   4    20
19   4    20