2016-12-17 11 views
-1

これは愚かな質問かもしれないので、私はまっすぐ考えていないので、私は本当に疲れています。しかし、私は基本的にマップできるようにしようとしています。整数を値にマッピングする

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

これは文脈があります。値の幅が2の場合は1、値が4の場合は1、オフセットが2の場合など

私はこれをうまく簡潔に行うことができる数学的方法はありますか?私は、HashMapや何かが少し過剰なものになると思っていましたが、8値の配列で検索するよりも良い方法があると確信しています。

+0

マッピングの背景にある論理は何ですか。 –

+0

(私のマッピングで軽い編集)1,2,4,8バイトはタイプのバイト(バイト、ショート、int、ロング)のサイズです。私は列挙子に命令を格納しています。MOV + 0、movsはMOV + 1です。MOV + get_width(type)はget_widthがマッピングを処理する場所です。 – user2588174

+0

なぜ 'sizeof()'を使わないのですか? – MBo

答えて

1

パターンがそうで16 => 432 => 564 => 6として継続場合 x => log2(x)であろう所定のパターンの整数をマッピングする簡単な数学的方法。

ほとんどの言語では、標準ライブラリの数値の対数を計算する方法があります。このメソッドが2以外の基数で対数を計算する場合は、代わりに基数2へのログを計算するヘルパーメソッドを作成できます。

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

ああ私のおかげであなたに感謝する! – user2588174

0

スイッチループを使用してください。

switch(値){
case 1:return 1;
break;
ケース2:2を返します。
break;
ケース4:戻り値3;
break;
ケース8:リターン4;
break;
デフォルト:return 0;
}

+0

ああ私は、%or + or - または何かのような操作でできると思われる数学的な数学があることを望んでいた。 – 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; 
      } 
     } 


    } 
関連する問題