有人可以向我解释这是做什么的吗?
#define ROUNDUP(n,width) (((n) + (width) - 1) & ~unsigned((width) - 1))
答案 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
的宏,它带有两个参数n
和width
,并返回值(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