2014-12-31 4 views
3

Я пытаюсь создать программу, которая создает квадрат поверх плитки на карте плитки. Плитки 64 на 64. Я думал, что мне нужно получить координаты мыши, округлить ее до ближайшего кратного 64, и разделить это на 64, чтобы получить координату плитки. Есть ли способ лучше? Должен ли я делать все кнопки плитки? Благодаря!Как округлить число до ближайшего кратного 64

ответ

7

Вы можете сделать это следующим образом:

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

Он работает следующим образом:

  1. Вы сначала добавить 32 (0x20) к числу так, чтобы оно округляется вверх/вниз. Это означает, что все ниже 32 приведет к значению ниже 64 и всему, что больше 32, к значению, превышающему 64.
  2. Вы маскируете последние шесть бит.

В целом побитовые операции выполняются быстрее, чем деление и умножение. И так как вы просите силы в два, это хороший хак производительности, который вы можете использовать.

Но если вас интересует координата плитки, вам не нужно ее снова умножать на 64. В этом случае вы можете использовать:

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

О пользовательском интерфейсе, как всегда mutliple правильные ответы, но если вы собираетесь рисовать какую-то карту на него, я думаю, координаты лучше, чем кнопки. Особенно, если позже в процессе люди смогут щелкнуть элементы на карте, которые лежат между двумя кнопками.

2

Для положительных целых чисел:

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

Или больше фантазии, потому что 64 случается быть степенью 2:

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

Здесь вы разделите его на 64, вам нужно округлить. И разделение на '64' можно сделать более эффективно, переместив ... –

+0

Зачем ему это нужно? Не округляется ли целая операция с ближайшей единицей? – JClassic

+0

@JClassic no. Целочисленная арифметика * trucates *, например вызов 'floor()', например '9/10 -> 0', который не округляется до ближайшего целого числа, а следующее целое число ниже результата разделения. – Bohemian

Смежные вопросы