Rust-盘一下数字相关的函数(一)

2019-10-10 16:31:21 浏览数 (3)

今天为啥要盘它呢?我的Rust IDE使用的是Clion Rust插件,使用起来非常方便,但是有一个问题,就是在使用数字相关的函数时,例如 checked_mul、max_value() 这样的函数的时候,IDE并没有给我输入提示和补全功能,所以本期想盘一下数字这部分功能。

内容很多,所以先盘一部分有符号整数的内容。

首先认识几个宏:

int_impl! ,用于定义有符号整型的成员方法,其内部各方法包括方法文档注释均是使用宏定义的(因为整型太多了,使用宏以复用,避免大量重复代码)

doc_comment! 用于定义方法以及方法的文档。

concat! 用于字符串与宏参数变量的连接

来了:

const fn min_value() -> Self 取最小值,无参数静态方法,在编译器运行,调用方法如下:

代码语言:javascript复制
i32::min_value();
----
-2147483648

const fn max_value() -> Self 取最大值。

from_str_radix(src: &str, radix: u32) -> Result<Self, ParseIntError> 将字符串数字片段转换为指定进制的数字。ParseIntError位于std::num::ParseIntError

代码语言:javascript复制
i32::from_str_radix("0", 10);
----
Ok(0)

const fn count_ones(self) -> u32 计算数字的二进制中1的个数。

代码语言:javascript复制
0b100_0100_i32.count_ones();
-----
2

const fn count_zeros(self) -> u32 计算数字的二进制中0的个数。

代码语言:javascript复制
0b100_0100_i32.count_zeros();
-----
5

const fn leading_zeros(self) -> u32 计算数字的二进制中从高位开始的连续0的个数。

代码语言:javascript复制
0b100_0100_i8.leading_zeros();
-----
1

const fn trailing_zeros(self) -> u32 计算数字的二进制中从低位开始的连续0的个数。

代码语言:javascript复制
0b100_0100_i8.leading_zeros();
-----
2

const fn rotate_left(self, n: u32) -> Self 位运算,左移n位,左侧溢出的位拼接到低位。与 << 左移符号不同。

代码语言:javascript复制
println!("{:b}", 0b1000010_i8.rotate_left(2));
----
1001

const fn rotate_right(self, n: u32) -> Self 位运算,右移n位,右侧溢出的位拼接到高位。与右移符号 >> 不同。

代码语言:javascript复制
println!("{:b}", 0b0000110_i8.rotate_right(2));
-----
10000001

const fn swap_bytes(self) -> Self 翻转数字的字节排序,重点在于是字节的顺序,以8bits为一个单位。

代码语言:javascript复制
println!("{:X}", 0x124321efi32.swap_bytes());
----
EF214312

const fn reverse_bits(self) -> Self 翻转数字的位的排序。

代码语言:javascript复制
println!("{:b}", 0b001i8.reverse_bits());
----
10000000

const fn from_be(x: Self) -> Self 将大端序转换为目标内存顺序

cfg!(target_endian="big") big/little 返回bool,判断内存顺序。

const fn from_le(x: Self) -> Self 将小端序转换为目标内存顺序

const fn to_be(self) -> Self 转换为大端序

const fn to_le(self) -> Self 转换为小端序

fn pow(self, mut exp: u32) -> Self 幂运算

代码语言:javascript复制
println!("{}", 3i32.pow(2));
-----
9

fn div_euclid(self, rhs: Self) -> Self 欧几里得除法,1.38.0版本稳定。

代码语言:javascript复制
println!("{}", (-5_i32).div_euclid(2));
println!("{}", -5 / 2);
-----
-3
-2

fn rem_euclid(self, rhs: Self) -> Self 欧几里得余数计算,1.38.0版本稳定。

代码语言:javascript复制
println!("{}", (-5_i32).rem_euclid(2));
println!("{}", -5 % 2);
----
1
-1

fn abs(self) -> Self 计算绝对值

const fn signum(self) -> Self 根据正负返回数字,0返回0,正数返回1,负数返回-1

const fn is_positive(self) -> bool 是否是正数,正数返回true,0和负数返回false

const fn is_negative(self) -> bool 是否是负数,负数返回true,0和正数返回true

const fn to_le_bytes(self) -> [u8; mem::size_of::<Self>()] 将数字内存形式转换为小端序的字节数组。(我的电脑是小端序)

代码语言:javascript复制
println!("{:?}", 0x0102_i32.to_le_bytes());
----
[2, 1, 0, 0]

const fn to_be_bytes(self) -> [u8; mem::size_of::<Self>()] 将数字内存形式转换为大端序的字节数组。

代码语言:javascript复制
println!("{:?}", 0x0102_i32.to_be_bytes());
----
[0, 0, 1, 2]

const fn to_ne_bytes(self) -> [u8; mem::size_of::<Self>()] 数字内存形式转换为本机采用的内存顺序。

const fn from_le_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self 将小端顺序的字节数组转换为数字。

代码语言:javascript复制
println!("{:x}", i32::from_le_bytes([2, 1, 0, 0]));
----
102  // 十六进制

const fn from_be_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self 将大端顺序的字节数组转换为数字。

const fn from_ne_bytes(bytes: [u8; mem::size_of::<Self>()]) -> Self 将本地内存顺序的字节数组转换为数字。

?小喇叭预告:下期盘点几种溢出计算的区别。

1 人点赞