#base #convert #radix

convert-base

将存储在向量中的数字的基数(基数)进行转换

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 算法

Download history 153/week @ 2024-04-04 171/week @ 2024-04-11 63/week @ 2024-04-18 206/week @ 2024-04-25 362/week @ 2024-05-02 98/week @ 2024-05-09 95/week @ 2024-05-16 69/week @ 2024-05-23 58/week @ 2024-05-30 95/week @ 2024-06-06 158/week @ 2024-06-13 195/week @ 2024-06-20 66/week @ 2024-06-27 26/week @ 2024-07-04 44/week @ 2024-07-11 87/week @ 2024-07-18

241 每月下载量
用于 4 个crate(3 个直接使用)

MIT/Apache

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_000Vec<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 的最大值,您可能会丢失精度。

性能

当基数对齐时,基数转换可以非常快。但是,在未对齐的基数之间转换长向量可能非常慢。

当两个整数 ab 满足方程 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)

创建一个新的基转换实例,用于在fromto之间进行转换。

letbase= Convert::new_unaligned(from: u64,to: u64)

创建一个新的基转换实例,不检查基对齐。

base.convert::<输入,输出>(输入: &[输入]) : Vec<输出>

在包含基self.from中数字的input上进行转换。返回数组中的数字将以self.to的基表示。请确保Output类型有足够的容量来存储输出基(self.to)中的数字。

无运行时依赖