将一个整数范围映射到另一个整数范围

本文关键字:整数 范围 映射 另一个 一个 | 更新日期: 2023-09-27 18:08:30

假设我有一组从0255的数字,我希望能够将该范围映射到063的一个较小的数字,以便较小集合中的每个值代表较大集合中的四个值。我还没能在标准c#中找到任何允许我这样做的东西。

如果我提前知道所有的值,我可以手动这样做,通过将输入除以4,即:

int input = 127;
int pInput = 127 / 4; // 31

该方法的主要问题是它对我来说不是完全可用的,因为我的数字集在它们的范围内会变化。我可以取较大的集合并将其除以较小的集合以获得除数值,该除数值将放在4所在的位置:

int divisor = lSet.Count / sSet.Count;  // 256 / 64 = 4
int pInput = input / divisor;           // 127 / 4 = 31

…但这不是一个完全准确的方法,因为我处理的是整数值,除数并不总是准确的。

有人处理过类似的事情或有可能的解决方案吗?

编辑:

为了澄清这里的目标,假设您有从0255的一系列输入,但是您只能处理从063的数字。我想映射这两个范围,这样如果大集合中的任何输入映射到小集合中的特定值。请注意,可以有不同的集合,我使用的只是作为示例。

可以有一组0136和一组025。上面的公式不能正确地映射两者,因为除数是5,而136的顶值不能映射到25的值。它将映射到27,这超出了范围。M-y的解在这里也行不通。

这是一个不依赖于数字的例子,而是一个概念:

|     n1    |     n2    |     n3    | ... |     ni    |
| n1 ... nm | nm ... nq | nq ... nr | ... | nj ... ni |

将一个整数范围映射到另一个整数范围

可以使用模数运算符%:

var result = x % 64;

更新:我将详述我的答案。模数运算符将给出除法后的余数。因此,在这种情况下,0 % 64 = 0, 1 % 64 = 1,…63 % 64 = 63, 64 % 64 = 0, 65 % 64 = 1


在上面的例子中,模数运算符将(0,64,128,192)的值映射为0,(1,65,129,193)映射为1,…(63, 127, 191, 255)至63。但是,如果您希望以(0,1,2,3)= 1,(4,5,6,7)= 2的格式创建集合,…,(252, 253, 254, 255) = 63。那么你已经有了正确的答案:

var divisor = (double)largeSet.Count / smallSet.Count;
var result = x / divisor;

如果你担心从零开始的数字,即你传入的x是256(在从零开始的情况下是255),那么只需先减去1:

 var result = (x - 1) / divisor;
 // (256 - 1) / 4
 // 255 / 4 = 63.