How to extract higher and lower 32 bits from 64 bits?

Hi,

I want to extract 32 bits from 64 bits on my no-std, embedded code. So to test, tried the following logic on x86 to test.

fn main() {
	let v: u64 = 0x1234_5678_9abc_def0;
	let hi32: u32 = (v & 0xFFFF_FFFF_0000_0000) >> 32;
	println!(" hi32 is {}", hi32);
}

It threw the error and gave the help to fix.

let hi32: u32 = (v & 0xFFFF_FFFF_0000_0000) >> 32;
expected u32, found u64
** expected due to this**
help: you can convert a u64 to a u32 and panic if the converted value doesn't fit
** |**
7 | let hi32: u32 = ((v & 0xFFFF_FFFF_0000_0000) >> 32).try_into().unwrap();
| + +++++++++++++++++++++

Then tried to fix the with the help

use std::convert::TryInto;
fn main() {
	let v: u64 = 0x1234_5678_9abc_def0;
        let hi32: u32 = ((v & 0xFFFF_FFFF_0000_0000) >> 32).try_into().unwrap();
	println!(" hi32 is {:2x}", hi32);
}

Result:
hi32 is 12345678 => It worked

Now, on my embedded code, I dont have std lib. So how to achieve extracting higher and lower 32 bits out of 64 bit value in no-std environment.

1 Like

just cast it directly with as keyword (btw, you don't need the bit mask operation, integer cast to smaller type will truncate automatically):

let hi32 = (v >> 32) as u32;
let lo32 = v as u32;
4 Likes

the document about numeric cast is:

https://doc.rust-lang.org/reference/expressions/operator-expr.html#numeric-cast

TryInto is available in core, so you can still use it (but as is a reasonable choice here too, since it obviously can't overflow).

3 Likes