2010-01-21 3 views
3

누군가가이 일을 어떻게 설명 할 수 있습니까?ROUNDUP? 그것은 무엇을합니까? C++에서

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

을이 C 인 경우 ++, 당신이 더 낫다 매크로보다 이것을 달성하기 위해 인라인 함수를 사용하여. – bobbymcr

+0

그게 뭐야? ???????????? – SuperString

+0

매크로가 왜 나쁜지에 대한 일반적인 이유가 있습니다. http://www.parashift.com/c++-faq-lite/inline-functions.html – jamesdlin

답변

6

2 (2,4,8,16,32 그래서 등)의 짝수 전력 폭을 제공되어, 그 너비의 배수와 같거나 n보다 큰 수를 반환하고있는 것 그 기준을 충족시키는 가장 작은 값입니다.

너비 = 16; 15> 16, 16> 16, 17> 32, 18> 32 등

EDIT이 기능이 왜 작동하는지에 대한 설명을 시작했습니다. 나는 그것이 OP가 원하는 것을 실제로 느끼지만, 다소 복잡한 이야기로 바뀌었다. OP가 여전히 혼란 스럽다면 몇 가지 간단한 예제를 통해 작업 해 보겠습니다. 폭 = 16, n = 15,16,17. & = 비트 AND, ~ = 비트 보완을 기억하고 예제를 통해 작업 할 때만 이진 표현을 사용하십시오.

+0

너비는 반드시 2의 거듭 제곱이어야합니다 ... 어떤 다른 경우에는 (예 : n <5의 경우 너비 넓이 3이 작동하지만 다른 일부 너비에서는 작동하지 않을 수 있습니다) 약간의 기괴한 경우에만 가능합니다. –

+2

@Bill - 짝수 * 2의 힘? 그건 이상한거야 ... – tony

+1

귀여운 토니 :-) 2^(1.58496298 ..) = 3 (말) 이후, 나는 그 유형의 2의 거듭 제곱임을 나타내는 여분의 한정어를 추가하는 것이 합리적이라고 생각한다. 나는 "2의 동등한 힘"이 그 일을하는 구어체의 일반적인 방법이라고 생각한다. 해학적 인 코멘트에 대한 유감스럽게 대답하는 것에 대해 유감스럽게 생각합니다 :-). –

0

unsigned 때문에 C에서 작동하지 않습니다. 여기에 한 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 
2

그것은 n은 다음의 '폭'까지 반올림 -하지만 폭이 2

의 전력으로 필요하다고 생각 예를 들어

는 == 8, N = 5 폭 :

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

그래서 5 라운드 제 아무것도 1 - 8 라운드에서 8.9 라운드에서 16 라운드 o 16. 기타 (0 회 0 회)

2

ROUNDUP 매크로는 n과 의 두 매개 변수를 사용하고 (n + width - 1) & ~unsigned(width - 1) 값을 반환합니다. 당신은 당신이 무엇을 알고 있다고 생각하면

:

이 시도 :

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

+1은 EVIL 예입니다. – tony