Java intValue()
возвращает младшие 32 бита целого числа.Это можно сделать с помощью побитовой операции И x & 0xffffffff
.A BigInt
в Rust не поддерживает побитовое манипулирование, но вы можете сначала преобразовать его в BigUint
, который поддерживает таких операций.
fn truncate_biguint_to_u32(a: &BigUint) -> u32 {
use std::u32;
let mask = BigUint::from(u32::MAX);
(a & mask).to_u32().unwrap()
}
Преобразование BigInt
в BigUint
будет успешным, только если оно не отрицательное.Если BigInt
является отрицательным (-x), мы могли бы найти младшие 32 бита его абсолютного значения (x), а затем аннулировать результат.
fn truncate_bigint_to_u32(a: &BigInt) -> u32 {
use num_traits::Signed;
let was_negative = a.is_negative();
let abs = a.abs().to_biguint().unwrap();
let mut truncated = truncate_biguint_to_u32(&abs);
if was_negative {
truncated.wrapping_neg()
} else {
truncated
}
}
Демо
Вы можете использовать truncate_bigint_to_u32(a) as i32
, если вам нужен номер со знаком.
Существует также метод to_signed_bytes_le()
, с помощью которого вы можете извлекать байты и декодировать их.непосредственно в примитивное целое число:
fn truncate_bigint_to_u32_slow(a: &BigInt) -> u32 {
let mut bytes = a.to_signed_bytes_le();
bytes.resize(4, 0);
bytes[0] as u32 | (bytes[1] as u32) << 8 | (bytes[2] as u32) << 16 | (bytes[3] as u32) << 24
}
Этот метод чрезвычайно медленный по сравнению с описанными выше методами, и я не рекомендую его использовать.