前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Rust-盘一下数字相关的函数(一)

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

作者头像
江湖安得便相忘
发布2019-10-10 16:31:21
7680
发布2019-10-10 16:31:21
举报
文章被收录于专栏:江湖安得便相忘

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 可回收BUG 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档