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

时间:2015-08-23 19:26:28

标签: rust

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

let big_v = vec![1,3,9];        // 139
let big_binary_v = func(big_v); // 10001011

big_binary_v的值相当于[1,0,0,0,1,0,1,1]

这个技巧是,如果不是因为向量可以表示任意大的整数,我可以实现这个简单,如果不是,我可以简单地做binary(100) + binary(30) + binary(9)。如果您有100000000000000001之类的数字,则无法计算binary(100000000000000000) + binary(1)。是否有任何技巧可以将此向量转换为二进制而不使用与大小相关的操作?

1 个答案:

答案 0 :(得分:2)

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

fn add_binary_fixed(left: &mut Vec<u8>, right: u8);
fn multiply_binary_fixed(binary_value: &mut Vec<u8>, by: u8);

然后就可以做到

let mut binary_value = vec![0];
for decimal_digit in decimal_value {
    multiply(binary_value, 10);
    add(binary_value, decimal_digit);
}
binary_value

如果使用特征和正确的类型,这可以推广到任何(有界的,自然编号的)基本转换:

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