从二进制流中提取数字
使用了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 协议》,转载必须注明作者和本文链接
推荐文章: