一、源码

这段代码实现了一个用于统计二进制补码整数位数的系统,支持多种自定义数值类型(Z0、P1、N1、B0、B1)。

use core::mem::size_of;
use crate::number::{Z0, P1, N1, B0, B1, Var};/// 统计二进制位数的 trait
pub trait BitLength {fn bit_length(self) -> usize;
}// 基本类型实现
impl BitLength for Z0 {fn bit_length(self) -> usize { 0 }  // Z0 不算位数
}impl BitLength for P1 {fn bit_length(self) -> usize { 1 }  // P1 = +1 (1位)
}impl BitLength for N1 {fn bit_length(self) -> usize { 1 }  // N1 = -1 (1位)
}/// B0<H> 的位数 = 1 (当前位) + H 的位数
impl<H> BitLength for B0<H>
whereH: BitLength,
{fn bit_length(self) -> usize {1 + self.0.bit_length()  // 递归调用(运行时,不会触发编译器递归检查)}
}/// B1<H> 的位数 = 1 (当前位) + H 的位数
impl<H> BitLength for B1<H>
whereH: BitLength,
{fn bit_length(self) -> usize {1 + self.0.bit_length()  // 递归调用(运行时)}
}/// 检查位数是否超过 Var<T> 的 T 的位数限制
pub fn check_bit_length<T>(value: impl BitLength) -> bool
whereT: PrimitiveInt,  // 假设 Primitive 是整数类型(如 i32, i64)
{let max_bits = size_of::<T>() * 8;  // 如 i32 = 32 位value.bit_length() <= max_bits
}

二、核心设计

  1. 类型定义
  • Z0:表示数值0(0位)

  • P1:表示+1(1位)

  • N1:表示-1(1位)

  • B0/B1:递归结构,表示二进制补码的高位部分

  1. 关键Trait

pub trait BitLength {fn bit_length(self) -> usize;  // 按值消费self
}
  • 所有数值类型必须实现该trait来计算自身位数

  • 按值传递(self而非&self)要求类型必须实现Copy或调用时转移所有权

三、位数计算规则

  1. 基本类型
类型位数解释
Z00数值0不占有效位
P11二进制1(+1)
N11二进制1(-1的补码)
  1. 复合类型
  • B0<H>:当前位0 + 高位位数

1 + self.0.bit_length()
  • B1<H>:当前位1 + 高位位数
1 + self.0.bit_length()

四、边界检查函数


pub fn check_bit_length<T>(value: impl BitLength) -> bool
whereT: PrimitiveInt,
{let max_bits = size_of::<T>() * 8;  // 计算T类型的位数容量value.bit_length() <= max_bits     // 比较实际位数
}
  • 功能:检查数值的位数是否不超过Var中T的位数限制

  • 示例:

let num = B0(B1(P1)); // 二进制01(十进制+1,2位)assert!(check_bit_length::<i32>(num)); // 检查是否适合i32(32位)

五、关键实现细节

  1. 递归解析
  • B0<B1>的解析过程:

    +B0.bit_length() → 1 + B1.bit_length()

    • B1.bit_length() → 1 + P1.bit_length()

    • P1.bit_length() → 1

    • 最终结果:1 + 1 + 1 = 3位

  1. 所有权处理
  • 所有方法使用self而非&self,意味着:

    • 类型应实现Copy(如#[derive(Copy, Clone)])

    • 或调用时转移所有权(适合一次性使用的场景)

  1. 泛型约束

impl<H> BitLength for B0<H> where H: BitLength
  • 确保嵌套类型H也必须实现BitLength

六、使用示例


// 定义结构体(需实现Copy)
#[derive(Copy, Clone)]
struct P1;// 计算B0(B1(P1))的位数
let num = B0(B1(P1));
assert_eq!(num.bit_length(), 3);// 检查是否适合i8
assert!(check_bit_length::<i8>(num)); // 3 <= 8

七、潜在问题与改进

  1. 递归深度
  • 问题:极深嵌套(如B0<B0<B0<…>>>)可能导致栈溢出

  • 改进:改为迭代实现(如用while let循环遍历结构)

  1. 类型限制
  • 要求:所有类型必须实现Copy或允许所有权转移

  • 替代方案:改用&self避免所有权问题

fn bit_length(&self) -> usize;

八、总结

该代码实现了一个类型安全的二进制位数统计系统:

  • 通过trait统一接口:所有数值类型实现BitLength

  • 递归计算位数:B0/B1递归组合子类型位数

  • 边界检查:验证数值是否适合目标整数类型(如i32)

  • 零成本抽象:编译期确定调用方式,无运行时开销

适用于需要精确控制二进制位数的场景(如硬件寄存器操作、定点数运算等)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88445.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88445.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/88445.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手教你安全删除Anaconda虚拟环境(避坑指南)

文章目录一、删除前必看清单&#xff08;超级重要&#xff09;二、三种删除方法对比&#xff08;建议收藏&#xff09;方法1&#xff1a;官方推荐命令&#xff08;最安全&#xff09;方法2&#xff1a;暴力删除大法&#xff08;快速但需谨慎&#xff09;方法3&#xff1a;核弹级…

Effective Modern C++ 条款7:区分使用 `()` 和 `{}` 创建对象

在 C11 及以后的版本中&#xff0c;初始化对象的方式变得更加灵活&#xff0c;但也带来了选择上的困惑。() 和 {} 是两种常见的初始化语法&#xff0c;它们在语义、行为和适用场景上有显著差异。本文将通过具体示例&#xff0c;深入解析这两种初始化方式的区别&#xff0c;并探…

Java基础-String常用的方法

String常用的三种构造方法 public static void main(String[] args) {//1.使用常量字符串构造String s1 "1.Hello world";System.out.println(s1);//2.使用new关键字构造String s2 new String("2.Hello world");System.out.println(s2);//3。使用字符数组…

数学建模:多目标规划:ε约束法、 理想点法

一、ε约束法定义ε约束法通过将部分目标函数转化为约束条件&#xff0c;保留一个主要目标进行优化。1、选择一个主要目标 fk​(x) 进行优化。2、其他目标 fi​(x) 转化为约束 fi​(x)≤εi​&#xff0c;其中 εi​ 是决策者设定的容许阈值。​​原理​​​​目标选择​​&…

linux kernel struct regmap_config结构详解

在 Linux 内核中&#xff0c;struct regmap_config 是 ​Regmap 子系统的核心配置结构体&#xff0c;用于定义如何与底层硬件寄存器进行交互。Regmap&#xff08;Register Map&#xff09;子系统通过抽象不同总线&#xff08;如 I2C、SPI、MMIO 等&#xff09;的寄存器访问细节…

【Python3教程】Python3高级篇之CGI编程

博主介绍:✌全网粉丝23W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

docker安装Consul笔记

安装过程 详细步骤如下&#xff1a; 首先拉取Consul的Docker镜像&#xff1a; docker pull hashicorp/consul:1.18.1创建Consul的配置文件和数据目录&#xff1a; mkdir -p /srv/docker/consul/data mkdir -p /srv/docker/consul/config在config目录下创建一个config.json配置文…

.net数据脱敏

.NET数据脱敏技术&#xff1a;保障数据安全的有效手段 在当今数字化时代&#xff0c;数据安全至关重要。尤其是涉及到用户的敏感信息&#xff0c;如密码、手机号码等&#xff0c;必须采取有效的措施进行保护。数据脱敏就是这样一种技术&#xff0c;它能够在不影响数据可用性的…

【openp2p】 学习2:源码阅读P2PNetwork和P2PTunnel

【openp2p】 学习1:P2PApp和优秀的go跨平台项目已经做了初步分析。阅读原版工程,感觉工程是一个暴露内网服务端口,让外部可以用的一个实现是一个完整的、跨平台的可商业化的应用。感谢作者需要学习作者的设计思路工程构建 F:\GolandProjects\openp2p\core\p2pnetwork.go通常…

网安学习NO.14

防火墙基础实验 传统防火墙配置实验拓扑图PC&#xff1a; ip 192.168.10.1 255.255.255.0 192.168.10.254 ip dns 114.114.114.114二层交换机 vl 10 ex int e0/0 sw mo ac sw ac vl 10 ex inr e0/1 sw tr en do sw mo tr三层交换机 vl 10 ex int g0/0 sw tr en do sw mo tr ex …

ESP32语音唤醒

两种唤醒方式AfeWakeWord与EspWakeWord对比 底层技术 AfeWakeWord&#xff1a;基于ESP-IDF的AFE框架&#xff08;esp_afe_sr_iface_t&#xff09;&#xff0c;高性能模式&#xff08;AFE_MODE_HIGH_PERF&#xff09;EspWakeWord&#xff1a;基于WakeNet接口&#xff08;esp_wn_…

借助 Wisdom SSH AI 助手,轻松安装 CentOS 8 LNMP 环境

打开Wisdom SSH软件&#xff0c;在AI对话区输入“在CentOS 8服务器安装LNMP环境”&#xff0c;AI助手会按以下步骤分析并执行安装&#xff1a; 安装Nginx 分析&#xff1a;CentOS 8默认软件源可能没有Nginx&#xff0c;所以要先启用Nginx官方软件源&#xff0c;然后才能安装Ngi…

WD0407 40V 7A 超级肖特基二极管,应用于开关汽车工业控制

WD0407 40V 7A 超级肖特基二极管说明​ 产品概述​ WD0407 是一款性能卓越的超级肖特基二极管&#xff0c;专为满足现代电子设备对高效、可靠电源管理的需求而设计。它采用先进的半导体制造工艺&#xff0c;在诸多关键性能指标上表现出色&#xff0c;能够为各类电路提供稳定、高…

卢比危机下的金融破局:科伦坡交易所技术升级作战图

&#x1f30f; 今日南亚风暴眼 印度双重上市机制加速落地&#xff1a;印度国家证券国际交易所&#xff08;NSE IX&#xff09;与科伦坡证券交易所&#xff08;CSE&#xff09;达成技术对接协议&#xff0c;斯企可通过印度GIFT City吸引美元资本&#xff0c;交易时段覆盖全球22小…

upload-labs靶场通关详解:第20关 /.绕过

一、分析源代码// 初始化上传状态标记&#xff0c;默认为false&#xff0c;即文件未上传 $is_upload false; // 初始化消息变量&#xff0c;用于存储错误信息 $msg null;// 检查是否通过POST方式提交了表单&#xff08;点击上传按钮&#xff09; if (isset($_POST[submit])) …

企业用云状态评估

云部署形态及其策略规划成熟度 单云部署&#xff1a; 主要业务负载运行在单一公有云或私有云上 多云/混合云部署 —有清晰战略规划与实施&#xff1a; 业务负载运行在多个云&#xff08;公有云或混合云&#xff09;上&#xff0c;并且企业拥有清晰的多云/混合云战略规划&#x…

STM32G473串口通信-USART/UART配置和清除串口寄存器状态的注意事项

USART和UART配置的区别 如果USART使用的是异步通信&#xff0c;那么UART与USART配置基本相同。 USART配置如下:UART配置如下&#xff1a;如果USART使用的是同步通信&#xff0c;那么UART配置就有差异。首先通信双方都是使用USART的同步通信&#xff0c;一个主机&#xff0c;一个…

Debezium:一款基于CDC的开源数据同步工具

Debezium 是由 Red Hat 开源的一种基于变更数据捕获&#xff08;CDC&#xff09; 的分布式平台&#xff0c;专为实时捕获和传播数据库的变更事件而设计。Debezium 常见的使用场景包括&#xff1a; 实时数据集成&#xff1a;将数据库变更同步到数据仓库或数据湖&#xff0c;支撑…

从面向对象编程语言PHP转到Go时的一些疑惑?

前言 1、php中面向对象编程时 与 Go中的区别&#xff1f; 2、php中最常使用laravel框架&#xff0c;不用过多关注依赖注入和反射&#xff0c;在go中又该如何使用呢&#xff1f;是 舍弃&#xff1f; 本文是一个系统化梳理&#xff0c;帮助从 语言哲学 → 依赖注入在 Go 的现状 →…

Vue3中使用konva插件动态制作海报以及可在画布上随意移动位置

1、下载konva插件 官网地址 npm install vue-konva konva --save2、在主文件中引入&#xff0c;如main.js import VueKonva from vue-konva; app.use(VueKonva);3、组件内使用&#xff0c;我现在的布局是左侧是画布&#xff0c;右侧是相关设置&#xff08;颜色、标题等&#…