当前位置: 首页 > news >正文

【typenum】 24 去除尾部零的特性(private.rs片段)

一、源码

这段代码实现了一个去除尾部零的特性(trait),专门用于处理倒序存储的无符号整数。

  1. 定义及别名
/// Gets rid of all zeros until it hits a one.
// ONLY IMPLEMENT FOR INVERTED NUMBERS!
pub trait TrimTrailingZeros {type Output;fn trim_trailing_zeros(self) -> Self::Output;
}
pub type TrimTrailingZerosOut<A> = <A as TrimTrailingZeros>::Output;
  1. 实现
impl TrimTrailingZeros for InvertedUTerm {type Output = InvertedUTerm;#[inline]fn trim_trailing_zeros(self) -> Self::Output {InvertedUTerm}
}impl<IU: InvertedUnsigned> TrimTrailingZeros for InvertedUInt<IU, B1> {type Output = Self;#[inline]fn trim_trailing_zeros(self) -> Self::Output {self}
}impl<IU: InvertedUnsigned> TrimTrailingZeros for InvertedUInt<IU, B0>
whereIU: TrimTrailingZeros,
{type Output = <IU as TrimTrailingZeros>::Output;#[inline]fn trim_trailing_zeros(self) -> Self::Output {self.msb.trim_trailing_zeros()}
}

二、核心概念

TrimTrailingZeros 特性用于移除二进制数末尾的零,直到遇到第一个1为止。

示例:

  • 10100(倒序存储)→ 去除尾部零 → 101

  • 100 → 1

  • 000 → 0(完全去除)

三、特性定义


pub trait TrimTrailingZeros {type Output;  // 关联类型:修剪后的输出类型fn trim_trailing_zeros(self) -> Self::Output;
}

四、三种实现情况

  1. 基础情况:空项(数字0)

impl TrimTrailingZeros for InvertedUTerm {type Output = InvertedUTerm;  // 0修剪后还是0fn trim_trailing_zeros(self) -> Self::Output {InvertedUTerm  // 直接返回空项}
}

处理数字0的情况,没有零需要去除。
2. 遇到1:停止修剪


impl<IU: InvertedUnsigned> TrimTrailingZeros for InvertedUInt<IU, B1> {type Output = Self;  // 输出类型不变fn trim_trailing_zeros(self) -> Self::Output {self  // 直接返回自身,停止修剪}
}

当遇到最低位是1时,说明已经到达有效数字的末尾,停止修剪。
3. 遇到0:继续递归修剪


impl<IU: InvertedUnsigned> TrimTrailingZeros for InvertedUInt<IU, B0>
whereIU: TrimTrailingZeros,  // 要求内部类型也能修剪
{type Output = <IU as TrimTrailingZeros>::Output;  // 使用内部的输出类型fn trim_trailing_zeros(self) -> Self::Output {self.msb.trim_trailing_zeros()  // 递归修剪更高位}
}

当最低位是0时,丢弃这个零,继续修剪更高位。

五、工作流程示例

假设有倒序数字 100(传统二进制 001 = 1):


// 类型:InvertedUInt<InvertedUInt<InvertedUInt<InvertedUTerm, B1>, B0>, B0>
// 修剪过程:
1. 最外层是B0 → 丢弃,递归修剪内部
2. 内部是B0 → 丢弃,递归修剪内部  
3. 内部是B1 → 停止修剪,返回自身
// 最终结果:InvertedUInt<InvertedUTerm, B1>(即数字1)

六、设计特点

  • 递归处理:通过类型递归逐步去除尾部零

  • 编译时操作:所有修剪在编译期完成

  • 类型级编程:使用关联类型保持类型安全

  • 条件实现:使用where子句约束类型能力

这种设计常用于需要精确控制数值表示的场景,如二进制协议处理或数值优化算法。

http://www.dtcms.com/a/347034.html

相关文章:

  • [激光原理与应用-320]:结构设计 - Solidworks - 软件工具UI组织的核心概念
  • 【软件设计模式】策略模式
  • 【MongoDB与MySQL对比】
  • 【React ✨】从零搭建 React 项目:脚手架与工程化实战(2025 版)
  • SpringBoot applicationContext.getBeansOfType获取某一接口所有实现类,应用于策略模式
  • Claude Code快捷键介绍(Claude Code命令、Claude Code指令、Claude Code /命令、Claude命令、Claude指令)
  • GEO优化供应商:AI搜索时代的“答案”构建与移山科技的引领,2025高性价比实战指南
  • LeetCode Hot 100 第二天
  • GaussDB 数据库架构师修炼(十八) SQL引擎-计划管理-SQL PATCH
  • MSPM0G3507环境搭建
  • 【基础-判断】设计师在设计动效时,点击响应性、运动帧率、跟手性不需要设定,根据不同机型的性能能力系统设定即可
  • 以太坊智能合约地址派生方式:EOA、CREATE 和 CREATE2
  • 水泉村信息化服务小程序的设计与实验
  • kettle从入门到精通 第105课 ETL之kettle 解决api接口无返回页数和记录数的分页问题
  • 1.10 本地模型调用编码实战(一)
  • Flink框架:算子链的介绍
  • 梯度下降(线性回归为例)
  • 深度学习入门:神经网络
  • 【KO】前端面试题六
  • Idea中 lombok 在“测试类中-单元测试”运行失败及解决方法
  • 怎样避免游戏检测到云手机?
  • C++矩阵类设计与实现:高效、健壮的线性代数工具
  • 文字学的多维透视:从符号系统到文化实践
  • 解密 Kubernetes 权限管理:supplementalGroups 的魔力与 fsGroup 的选择
  • Linux服务器systemd服务配置详细指南
  • 【线程池】ThreadPoolTaskExecutor和redis的配置案例
  • 《UE教程》第一章第十一回——UE5.6打包安卓
  • Python 字符串查找,计数,判断,修改
  • Linux服务器利用Systemd配置定时任务
  • 手机横屏适配方案