rust - 可以将 BigInteger 截断为 Rust 中的 i32 吗?

标签 rust biginteger

在 Java 中,intValue() 返回 BigInteger 实例的截断部分。我用 Rust 写了一个类似的程序,但它似乎没有截断:

extern crate num;

use num::bigint::{BigInt, RandBigInt};
use num::ToPrimitive;

fn main() {
    println!("Hello, world!");
    truncate_num(
        BigInt::parse_bytes(b"423445324324324324234324", 10).unwrap(),
        BigInt::parse_bytes(b"22447", 10).unwrap(),
    );
}

fn truncate_num(num1: BigInt, num2: BigInt) -> i32 {
    println!("Truncation of {} is {:?}.", num1, num1.to_i32());
    println!("Truncation of {} is {:?}.", num2, num2.to_i32());
    return 0;
}

我从这里得到的输出是

Hello, world!
Truncation of 423445324324324324234324 is None.
Truncation of 22447 is Some(22447).

我如何在 Rust 中实现这一点?我应该尝试转换为 String 然后手动截断吗?这是我最后的选择。

最佳答案

Java 的 intValue() 返回整数的最低 32 位。这可以通过按位与运算 x & 0xffffffff 来完成。 BigInt in Rust 不支持按位操作,但您可以先将其转换为 BigUint 以进行 supports 此类操作。

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),我们可以找到它的绝对值(x)的最低 32 位,然后取反结果。

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
    }
}

Demo

如果您需要签名号码,您可以使用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
}

与上述方法相比,这种方法非常慢,我不建议使用它。

关于rust - 可以将 BigInteger 截断为 Rust 中的 i32 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50484012/

相关文章:

windows - 从 Windows 为 Raspberry Pi 3 B 交叉编译裸机 Rust

java - 从大输入值中获取所有最小值和最大值的总和

c++ - 哪种基数更适合我的 BigInteger 库?

c# - BigInteger 双基数幂计算 C#

performance - num crate 中的大整数实现是否很慢?

java - 编码 RSA 算法 Java

rust - 如何安全地使用由唯一 ID 表示的外部数据?

multithreading - 如果我不知道将创建多少个线程,该如何等待所有线程?

unit-testing - 如何断言 Rust 中的 io 错误?

rust - 创建Docker镜像后出现的问题