将值映射到整数
我真的很累,所以这可能是一个愚蠢的问题,我只是不想直。但我想基本上让这个我可以映射将值映射到整数
1 => 0
2 => 1
4 => 2
8 => 3
此的背景是,我有东西的数组。然后我传入一个值,如果值的数目是1,我想访问数组的偏移量0,如果值的宽度为2,偏移量为1,如果值为4,偏移量为2等。
有没有一些数学方法可以做到这一点很好和简洁?我想到了一个HashMap或者其他东西会有点矫枉过正,并且我确信有一个比8值数组中的lookup更好的方法。
一个简单的和数学的方式在给定模式的整数映射是,如果模式继续为16 => 4
,32 => 5
,64 => 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
}
哦,我的上帝,我爱你,谢谢! – user2588174
使用开关回路。
switch(value){
case 1:return 1;
break;
情况2:返回2;
break;
案例4:返回3;
break;
案例8:返回4;
break;
默认值:return 0;
}
唉,我希望会有一些奇特的数学,我可以做像%或+或 - 或什么的操作 – user2588174
试试这个。如果数组有错误的数据,您可以添加条件来抛出异常。
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;
}
}
}
映射背后的逻辑是什么,如果有的话? –
(在我的映射中轻微编辑)所以1,2,4,8是以字节(byte,short,int,long)为单位的类型的大小。我在枚举器中存储指令,我想要说movb它的MOV + 0,movs是MOV + 1.为了使事情更好,我可以做MOV + get_width(类型),其中get_width将处理映射。 – user2588174
为什么不使用'sizeof()'? – MBo