2016-12-17 126 views
-1

我真的很累,所以这可能是一个愚蠢的问题,我只是不想直。但我想基本上让这个我可以映射将值映射到整数

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

此的背景是,我有东西的数组。然后我传入一个值,如果值的数目是1,我想访问数组的偏移量0,如果值的宽度为2,偏移量为1,如果值为4,偏移量为2等。

有没有一些数学方法可以做到这一点很好和简洁?我想到了一个HashMap或者其他东西会有点矫枉过正,并且我确信有一个比8值数组中的lookup更好的方法。

+0

映射背后的逻辑是什么,如果有的话? –

+0

(在我的映射中轻微编辑)所以1,2,4,8是以字节(byte,short,int,long)为单位的类型的大小。我在枚举器中存储指令,我想要说movb它的MOV + 0,movs是MOV + 1.为了使事情更好,我可以做MOV + get_width(类型),其中get_width将处理映射。 – user2588174

+0

为什么不使用'sizeof()'? – MBo

回答

1

一个简单的和数学的方式在给定模式的整数映射是,如果模式继续为16 => 432 => 564 => 6x => 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(value){
case 1:return 1;
break;
情况2:返回2;
break;
案例4:返回3;
break;
案例8:返回4;
break;
默认值:return 0;
}

+0

唉,我希望会有一些奇特的数学,我可以做像%或+或 - 或什么的操作 – 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; 
      } 
     } 


    }