C++ 综合报道?它有什么作用?在C++;
有人能给我解释一下这是干什么的吗C++ 综合报道?它有什么作用?在C++;,c++,C++,有人能给我解释一下这是干什么的吗 #define ROUNDUP(n,width) (((n) + (width) - 1) & ~unsigned((width) - 1)) 如果宽度是2的偶数幂(因此2,4,8,16,32等),它将返回一个等于或大于n的数字,这是宽度的倍数,是满足该标准的最小值 So宽度=16;5->16,7->16,15->16,16->16,17->32,18->32等 编辑我一开始就解释了为什么这样做,因为我感觉这才是OP真正想要的,但它变成了一个相当复杂的
#define ROUNDUP(n,width) (((n) + (width) - 1) & ~unsigned((width) - 1))
如果宽度是2的偶数幂(因此2,4,8,16,32等),它将返回一个等于或大于n的数字,这是宽度的倍数,是满足该标准的最小值 So宽度=16;5->16,7->16,15->16,16->16,17->32,18->32等
编辑我一开始就解释了为什么这样做,因为我感觉这才是OP真正想要的,但它变成了一个相当复杂的故事。如果OP仍然不清楚,我建议通过几个简单的例子,比如width=16,n=15,16,17。请记住&=按位AND、~=按位补码,并在处理示例时专门使用二进制表示。它在
C
中不起作用,因为是无符号的。以下是is的功能,只要宽度限制为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
它将n四舍五入到下一个“宽度”——但我认为宽度需要是2的幂
例如,宽度=8,n=5:
(5+8-1)和(7)
= 12 & ~7
=8
所以5轮到8轮。任何1-8轮到8轮。9到16轮到16轮。Etc.(0轮到0)它定义了一个名为ROUNDUP
的宏,该宏接受两个参数n
和width
,并返回值(n+width-1)和~unsigned(width-1)
:)
如果您认为自己知道它的功能,请尝试以下方法:
std::string s("WTF");
std::complex<double> c(-11,5);
ROUNDUP(s, c);
std::字符串s(“WTF”);
std::复合物c(-11,5);
综述(s,c);
如果这是C++,最好使用内联函数来实现这一点,而不是宏。ie ROUNDUP(n,x++)做什么?嗯,它增加x两次!内联函数没有这个问题。另外,看看STingRaySC的答案——宏可以传递任何东西。函数有类型。如果ROUNDUP是一个函数,那么STingRaySC的示例将无法编译。(虽然我也不确定它是否会编译为宏,但总体而言,宏的无类型特性是一个问题)。除其他原因外。宏是邪恶的。请注意宽度必须是二的幂。。。有些情况下,舍入法似乎适用于其他宽度(舍入法宽度3适用于n:-),因为2^(1.58496298..)=3(例如),我认为添加额外的限定符以指示排除该类型的2的幂是合理的。我认为“2的偶数幂”是一种常见的口语方式。很抱歉对一个幽默的评论做出了一个迂腐的回答:-)。@比尔,我以为你排除了1;)由于这使得部分~无符号((宽度)-1)
等于0,因此整个结果等于0。@JPvdMerwe不,我认为我们可以包括1,因为掩码不是0,而是~0(0的补码,即所有1),因此宏是No op,即n->n,正如您所期望的(四舍五入到1的最接近倍数=不做任何事情).你说得对,我脑子里的操作员的命令搞混了。只有当宽度=0时,我所说的才会发生。