2016-12-17 2 views
-1

Я действительно устал, поэтому это может быть глупый вопрос, и я просто не думаю прямо. Но я пытаюсь в основном сделать так, чтобы я мог отображатьСопоставление значений с целыми числами

1 => 0 
2 => 1 
4 => 2 
8 => 3 

Контекст для этого заключается в том, что у меня есть множество вещей. Затем я передаю значение, если номер значения равен 1, я хочу получить доступ к смещению массива на 0, если значение имеет ширину 2, смещение на 1, если значение равно 4, смещение на 2 и т. Д.

Есть ли какой-то математический способ, я могу сделать это красиво и лаконично? Я понял HashMap, или что-то будет немного переборщить, и я уверен, что есть лучший способ, чем поиск в массиве из 8 значений.

+0

Какова логика отображения, если таковая имеется? –

+0

(Небольшое редактирование в моем сопоставлении) Итак, 1, 2, 4, 8 являются размерами типов в байтах (байт, короткий, int, long). Я сохраняю инструкции в перечислителе, и я хочу, чтобы сказать movb его MOV + 0, movs - MOV + 1. Чтобы сделать все лучше, я могу сделать MOV + get_width (type), где get_width будет обрабатывать отображение. – user2588174

+0

Почему бы не использовать 'sizeof()'? – MBo

ответ

1

Простой и математический способ отображения целых чисел в данном шаблоне будет x => log2(x)если картина продолжается 16 => 4, 32 => 5, 64 => 6 и так далее.

Большинство языков имеют метод вычисления логарифма числа в стандартной библиотеке. Если этот метод вычисляет логарифм в базе, отличной от 2, вы можете создать вспомогательный метод, который вместо этого вычисляет журнал на базу 2.

float log2(float x) { 
    const float logOf2 = log(2); 
    return log(x)/logOf2; // log() is your standard library log 
} 
+0

О, боже, я люблю тебя! – user2588174

0

Используйте петлю переключателя.

переключатель (значение) {
case 1: return 1;
break;
case 2: return 2;
break;
case 4: return 3;
break;
case 8: return 4;
break;
default: return 0;
}

+0

Aw Я надеялся, что будет какая-то причудливая математика, которую я мог бы сделать с такими операциями, как% или + или - или что-то – user2588174

0

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

public static void main(String[] args) { 
      int[] vals = new int[]{1,2,4,8}; 
      for(int i : vals){ 
       System.out.println(getResult(i)); 
      } 
     } 

    private static int getResult(int element){ 
     int i = -1; 
     int temp = 2; 
     while(true){ 
      i++; 
      int result = (int) Math.pow(temp,i); 
      if(result == element){ 
       return i+1; 
      } 
     } 


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