2014-12-31 4 views
3

타일 맵의 타일 위에 사각형을 만드는 프로그램을 만들려고합니다. 타일은 64 x 64입니다. 마우스의 좌표를 가져와 가장 가까운 64의 배수로 반올림하고 타일 좌표를 얻기 위해 64로 나눌 필요가 있다고 생각했습니다. 더 좋은 방법이 있습니까? 모든 타일 버튼을 만들어야합니까? 감사! 다음과 같이숫자를 가장 가까운 64의 배수로 반올림하는 방법

답변

7

이 작업을 수행 할 수 있습니다 다음과 같이

int number = 445226; 
int roundoff = (number+0x20)&(~0x3f); 

의미가 있습니다 : 그것은/아래로 반올림되도록

  1. 먼저 수를 32 (0x20)를 추가합니다. 즉, 32 아래의 값은 64보다 작고 32보다 큰 값은 64보다 큰 값이됩니다.
  2. 마지막 6 비트를 마스크 처리합니다.

일반적으로 비트 단위 연산은 나누기 및 곱셈보다 빠릅니다. 그리고 2의 거듭 제곱을 요구하기 때문에 사용할 수있는 멋진 성능 해킹입니다.

타일 좌표에 관심이 있다면 64으로 다시 곱할 필요가 없습니다. 항상 mutliple 답변이 올로, 사용자 인터페이스에 대한

int number = 445226; 
int div64 = (number+0x20)>>0x06; //this is divided by 64, not rounded 

,하지만 당신이 그것에지도의 어떤 종류를 칠려고하는 경우에, 나는 좌표가 버튼보다 더 추측 :이 경우 당신은 사용할 수 있습니다. 특히 프로세스의 후반부에 사람들은지도에서 두 개의 버튼 사이에있는 항목을 클릭 할 수 있습니다. 양의 정수에 대한

2

:

int m64 = 64 * ((n + 32)/64); 

이상 공상 (64)는 2의 거듭 제곱 될 일이 있기 때문에 다음은

int m64 = ((n + 32) >> 6) << 6; 
+0

는 64으로 나누면, 당신은 그것을 반올림해야합니다. 그리고 '64 '에 의한 구분은 다음과 같이 쉬프트함으로써 더 효율적으로 수행 될 수 있습니다. –

+0

왜 그가 그것을 반올림해야합니까? 정수 연산이 가장 가까운 단위로 반올림되지 않습니까? – JClassic

+0

@ JClassic no. 가장 가까운 정수로 반올림하지 않는 '9/10 -> 0'과 같은 'floor()'를 호출하는 것과 같은 정수 연산 * trucates *가 나눗셈 결과 아래의 다음 정수. – Bohemian

관련 문제