从二进制流中提取数字

使用了bitvec库,需要引入此库。
Cargo.toml

[dependencies]
bitvec = "1"
use bitvec::prelude::*;

fn main() {
    let mut data1 = [7u8,2u8,1u8];

    let data2:&mut [u8] = &mut data1;
    let bits2 = data2.view_bits_mut::<Msb0>();

    println!("bits2=={:?}", bits2);

    let result_op1 = fetch_u64_from_bitset(bits2, 8);
    println!("result_op1={:?}", result_op1); //7

    bits2.shift_left(6);
    let result_op2 = fetch_u64_from_bitset(bits2, 2); //3
    println!("result_op2={:?}", result_op2);

    bits2.shift_left(8);
    let result_op3 = fetch_u64_from_bitset(bits2, 2); //2
    println!("result_op3={:?}", result_op3);
}

fn fetch_u64_from_bitset(bits:&BitSlice<u8,bitvec::order::Msb0>, bit_count:usize) -> Option<u64>{
    if bit_count > bits.len() || bit_count==0{
        return None;
    }

    let mut v:u64 = 0;
    let bit_count_less = bit_count-1;
    for i in 0..bit_count {
        v = v | bits[i] as u64;

        //最后一次循环时 不再向左移动一位了
        if i != bit_count_less {
            v <<=1;
        }
    }

    return Some(v);
}

输出结果

bits2==BitSlice<u8, bitvec::order::Msb0> { addr: 0xb9a253f825, head: 000, bits: 24 } [0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1]
result_op1=Some(7)
result_op2=Some(3)
result_op3=Some(2)
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!