首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BigInteger能被截断为锈蚀中的i32吗?

BigInteger能被截断为锈蚀中的i32吗?
EN

Stack Overflow用户
提问于 2018-05-23 08:57:03
回答 2查看 2K关注 0票数 3

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

代码语言:javascript
复制
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;
}

我从这得到的输出是

代码语言:javascript
复制
Hello, world!
Truncation of 423445324324324324234324 is None.
Truncation of 22447 is Some(22447).

我怎样才能在锈病中实现这一目标?我是否应该尝试转换为String,然后手动截断?这将是我最后的选择。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-23 10:15:07

Java的intValue()返回整数的最低32位。这可以通过按位操作x & 0xffffffff来完成。铁锈不支持按位操作,但您可以首先将其转换为一个支座这样操作的BigUint

代码语言:javascript
复制
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位,然后否定结果。

代码语言:javascript
复制
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()方法,您可以用它直接提取字节并将其解码为基本整数:

代码语言:javascript
复制
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
}

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

票数 8
EN

Stack Overflow用户

发布于 2018-05-23 09:12:08

不存在将大整数自然截断为较小整数的现象。它要么适合,要么你必须决定你想要的价值。

你可以这样做:

代码语言:javascript
复制
println!("Truncation of {} is {:?}.", num1, num1.to_i32().unwrap_or(-1));

代码语言:javascript
复制
println!("Truncation of {} is {:?}.", num1, num1.to_i32().unwrap_or(std::i32::MAX));

但是,当返回的选项不包含任何值时,应用程序逻辑可能会规定所需的行为。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50484012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档