Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 综合报道?它有什么作用?在C++;_C++ - Fatal编程技术网

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时,我所说的才会发生。