6 个稳定版本
1.1.2 | 2021 年 10 月 25 日 |
---|---|
1.1.1 | 2021 年 5 月 11 日 |
1.1.0 | 2020 年 2 月 23 日 |
1.0.2 | 2019 年 5 月 12 日 |
#438 in 算法
241 每月下载量
用于 4 个crate(3 个直接使用)
9KB
113 行
convert-base
将存储在向量中的数字的基数(基数)进行转换。
- 纯Rust,无大整数依赖或中间转换
- 设计围绕无符号整数类型的向量,而不是字符串
- 当基数对齐时,在大型向量上非常快(请参阅下面的性能部分)
示例
将存储在 Vec<u8>
中的基数 4 数据转换为存储在 Vec<u16>
中的基数 500 数据
use convert_base::Convert;
fn main () {
let mut base = Convert::new(4,500);
let output = base.convert::<u8,u16>(&vec![1,1,1,1,2,2,1,0,2,2,0,0,2,1]);
assert_eq!{output, vec![397, 150, 405]};
}
或将基数 4_000_000_000
的 Vec<u32>
转换为基数 700 的 Vec<u16>
use convert_base::Convert;
fn main () {
let mut base = Convert::new(4_000_000_000,700);
let output = base.convert::<u32,u16>(&vec![
3_900_000_000, 3_500_004_500, 3_000_000_000, 2_500_000_000,
2_000_000_000, 1_500_000_000, 1_000_003_300, 2_500_000_000,
3_000_000_000, 3_700_050_000, 2_400_000_000, 1_250_000_052
]);
assert_eq![output, vec!{
300, 71, 255, 325, 23, 591, 267, 188, 488, 553, 124, 54, 422, 411, 116,
411, 85, 558, 4, 498, 384, 106, 465, 635, 75, 120, 226, 18, 634, 631,
116, 464, 111, 679, 17, 382, 67, 99, 208, 164, 8
}];
}
对于输入和输出向量,最低有效位位于数组的开头。
内部使用 u64 来存储中间计算,例如两个数字相加或执行进位。如果您输入或输出的基数接近 u64 的最大值,您可能会丢失精度。
性能
当基数对齐时,基数转换可以非常快。但是,在未对齐的基数之间转换长向量可能非常慢。
当两个整数 a
和 b
满足方程 base1.pow(a) == base2.pow(b)
时,两个基数是对齐的。这个比率 a:b
描述了基数如何干净地重叠。例如,256 基数中的 3 位正好对应于 64 基数中的 4 位。或者,243 基数中的 2 位正好对应于 3 基数中的 10 位(因为 243.pow(2) == 3.pow(10)
)。
在这台旧2014年款的笔记本电脑上,将5_000
位数字
- 从基243转换为基9,耗时0.00234秒
- 从基243转换为基10,耗时1.26秒
并将50_000
位数字
- 从基243转换为基9,耗时0.0149秒
- 从基243转换为基10,耗时125.3秒
api
use convert_base::Convert;
letbase= Convert::new(from: u64,to: u64)
创建一个新的基转换实例,用于在from
和to
之间进行转换。
letbase= Convert::new_unaligned(from: u64,to: u64)
创建一个新的基转换实例,不检查基对齐。
base.convert::<输入,输出>(输入: &[输入]) : Vec<输出>
在包含基self.from
中数字的input
上进行转换。返回数组中的数字将以self.to
的基表示。请确保Output
类型有足够的容量来存储输出基(self.to
)中的数字。