Rust 将单个整数的向量转换为单个二进制值的向量

Rust 将单个整数的向量转换为单个二进制值的向量,rust,Rust,如果我有一个表示任意大数的向量,big_v,我希望能够将这个向量转换成一个包含big_v二进制表示的向量,以便实现除法算法。这么说 let big_v = vec![1,3,9]; // 139 let big_binary_v = func(big_v); // 10001011 big\u binary\u v的值相当于[1,0,0,1,0,1,1] 这个技巧是,如果不是因为向量可以表示任意大的整数,我可以很容易地实现它,如果不是,我可以简单地执行binary(100)+b

如果我有一个表示任意大数的向量,
big_v
,我希望能够将这个向量转换成一个包含
big_v
二进制表示的向量,以便实现除法算法。这么说

let big_v = vec![1,3,9];        // 139
let big_binary_v = func(big_v); // 10001011
big\u binary\u v
的值相当于
[1,0,0,1,0,1,1]



这个技巧是,如果不是因为向量可以表示任意大的整数,我可以很容易地实现它,如果不是,我可以简单地执行
binary(100)+binary(30)+binary(9)
。但是,如果您有一个类似于
10000000000000001
的数字,则无法计算
binary(1000000000000000)+binary(1)
。有没有什么技巧可以在不使用大小相关操作的情况下将此向量转换为二进制?

最明显的方法是生成一些抽象操作

fn add_binary_fixed(left: &mut Vec<u8>, right: u8);
fn multiply_binary_fixed(binary_value: &mut Vec<u8>, by: u8);
如果使用特征和适当的类型,这可以推广到任何(有界的、自然编号的)基转换:

fn convert(value: &LargeInteger, base: u8) -> LargeInteger {
    let mut output = LargeInteger::new(base);
    for digit in value {
        output.multiply(base);
        output.add(digit);
    }
    output
}

位向量是一种非常低效的表示。考虑编写在您的代码> VEC < /代码>(或任何操作)上操作的访问器方法,访问和设置数字的各个位。这假设您的数字是一捆捆的位,而不是十进制数字,但老实说,很少有好的理由不这样做。@delnan我假设OP不担心这里的最高效率,但主要是将其用作学习练习。否则,我会假设有一个任意精度的库可以使用(但我还没有看)。然而,这个问题的描述是可以澄清的。@Shepmaster我提出的更改并不是一个非常复杂的更改,而且它很容易在内存中节省8倍的内存(对于许多算法来说,缓存命中的相关增加也会非常大)。
fn convert(value: &LargeInteger, base: u8) -> LargeInteger {
    let mut output = LargeInteger::new(base);
    for digit in value {
        output.multiply(base);
        output.add(digit);
    }
    output
}