将一个整数范围映射到另一个整数范围
本文关键字:整数 范围 映射 另一个 一个 | 更新日期: 2023-09-27 18:08:30
假设我有一组从0
到255
的数字,我希望能够将该范围映射到0
到63
的一个较小的数字,以便较小集合中的每个值代表较大集合中的四个值。我还没能在标准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
…但这不是一个完全准确的方法,因为我处理的是整数值,除数并不总是准确的。
有人处理过类似的事情或有可能的解决方案吗?
编辑:为了澄清这里的目标,假设您有从0
到255
的一系列输入,但是您只能处理从0
到63
的数字。我想映射这两个范围,这样如果大集合中的任何输入映射到小集合中的特定值。请注意,可以有不同的集合,我使用的只是作为示例。
可以有一组0
到136
和一组0
到25
。上面的公式不能正确地映射两者,因为除数是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.