繁体   English   中英

从 BigInt 转换为 BitArray

[英]converting from BigInt to BitArray

使用 rust 将 object 从 bigint (BigInt) 转换为位 (BitArray<217>) 的最佳方法也是反向的(下面的示例)

使用二进制到十进制计算器我手工验证了 bigint 和 bits 相等


let bigint = BigInt::parse_bytes("141644482300309102636663083870634002744809361056209271964506585197".as_ref(), 10);

to 

let bits = BitArray::new( [1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1]);

板条箱参考。

对于 BigInt: https://crates.io/crates/num-bigint (num-bigint = "0.4.3")

对于 BitArray: https://crates.io/crates/bitarray (bitarray = "0.10.0")

几个误解:

  • 您不能将运行时已知的大小 ( BigInt ) 转换为编译时已知的大小 ( BitArray )
  • BigInt已签名,但在转换过程中您绝不会考虑签名。 如果您想忽略签名,您可能想改用BigUint
  • 您用于比较的BitArray仅包含10值。 然而, bitarray::BitArray表示字节,意思是每个值都是 8 位,取值范围为0255 如果你转换它,值实际上是BitArray::new([1, 88, 81, 147, 230, 162, 120, 203, 210, 232, 153, 239, 115, 92, 222, 74, 147, 18, 216, 202, 55, 207, 181, 126, 72, 92, 248, 109])28长。
  • bitarray::BitArray似乎无法按位迭代它,所以我不知道这个库对你有多大用处。 它强制编译时间大小的事实也与您的用例不兼容。 您可能应该选择不同的库。 “位数组”的整个概念可能不是您想要的,您可能想要一个具有运行时大小的“位向量”。

也就是说, bitarraypacked bits组成,这意味着每个值 8 位(或更多)。 如果你想要一个纯Vec<bool> ,你不需要任何这些,你可以直接将它转换成那个:

use num_bigint::BigUint;

fn main() {
    let bigint = BigUint::parse_bytes(
        "141644482300309102636663083870634002744809361056209271964506585197".as_ref(),
        10,
    )
    .unwrap();

    let bits = bigint
        .to_bytes_be()
        .into_iter()
        .flat_map(|val| {
            let val = [
                (val >> 7) & 1,
                (val >> 6) & 1,
                (val >> 5) & 1,
                (val >> 4) & 1,
                (val >> 3) & 1,
                (val >> 2) & 1,
                (val >> 1) & 1,
                (val >> 0) & 1,
            ];

            val.into_iter()
        })
        .collect::<Vec<_>>();

    println!("{:?}", bits);
}
[0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1]

并不是说您给出的值似乎是小端,而这个是大端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM