今天为啥要盘它呢?我的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 将本地内存顺序的字节数组转换为数字。
完