代码

		////// @brief 左右翻转位。////// @note 翻转后,最低位位将变为最高位,最高位将变为最低位。//////template <typename T>requires(std::is_same_v<T, uint8_t>)constexpr T Reverse(T value){int32_t bit_count = sizeof(T) * 8;for (int32_t i = 0; i < bit_count / 2; i++){int32_t left_index = bit_count - 1 - i;int32_t right_index = i;bool left_bit = base::bit::ReadBit(value, left_index);bool right_bit = base::bit::ReadBit(value, right_index);base::bit::WriteBit(value, left_index, right_bit);base::bit::WriteBit(value, right_index, left_bit);}return value;}////// @brief 左右翻转位。////// @note 翻转后,最低位位将变为最高位,最高位将变为最低位。//////template <typename T>requires(std::is_integral_v<T> && !std::is_same_v<T, uint8_t>)constexpr T Reverse(T value){if (std::is_constant_evaluated()){// 编译时计算路径int32_t bit_count = sizeof(T) * 8;for (int32_t i = 0; i < bit_count / 2; i++){int32_t left_index = bit_count - 1 - i;int32_t right_index = i;bool left_bit = base::bit::ReadBit(value, left_index);bool right_bit = base::bit::ReadBit(value, right_index);base::bit::WriteBit(value, left_index, right_bit);base::bit::WriteBit(value, right_index, left_bit);}return value;}// 运行时计算路径class Table{private:std::array<uint8_t, 256> _table{};public:constexpr Table(){for (int32_t i = 0; i < 256; i++){_table[i] = base::bit::Reverse(static_cast<uint8_t>(i));}}constexpr uint8_t operator[](uint8_t index) const{return _table[index];}};constexpr Table table{};uint8_t *bytes = reinterpret_cast<uint8_t *>(&value);for (size_t i = 0; i < sizeof(T); i++){bytes[i] = table[bytes[i]];}std::reverse(bytes, bytes + sizeof(T));return value;}

先准备一个针对 uint8_t 的版本

		template <typename T>requires(std::is_same_v<T, uint8_t>)constexpr T Reverse(T value)

后续表格的建立基于这个版本。

翻转一个 8 位以上的整型的位,等价于逐个字节翻转,然后翻转字节序。这是可以用查表法优化的理论基础。

使用 constexpr 生成一个表格

			// 运行时计算路径class Table{private:std::array<uint8_t, 256> _table{};public:constexpr Table(){for (int32_t i = 0; i < 256; i++){_table[i] = base::bit::Reverse(static_cast<uint8_t>(i));}}constexpr uint8_t operator[](uint8_t index) const{return _table[index];}};constexpr Table table{};

翻转一个字节只需查表即可完成。对于 64 位整型,需要查表 8 次,然后翻转 8 个字节。

针对非 uint8_t 的版本

		template <typename T>requires(std::is_integral_v<T> && !std::is_same_v<T, uint8_t>)constexpr T Reverse(T value)

中使用了 std::is_constant_evaluated() ,为编译时计算和运行时计算分别定制了逻辑。

测试

		// 0b10100111 = 0xa7 重复 8 次。// 0xa7a7a7a7a7a7a7a7constexpr uint64_t num = base::bit::Reverse(static_cast<uint64_t>(0b1010011110100111101001111010011110100111101001111010011110100111));std::cout << base::ToHexString(num) << std::endl;

运行结果

0xa84
0xe5e5e5e5e5e5e5e5

在这里插入图片描述
使用计算器验证
在这里插入图片描述

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

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

相关文章

知识库搭建之Meilisearch‘s 搜索引擎 测评-东方仙盟测评师

windows 启动后 启动成功后关键信息 Config file path: "none" Database path: "./data.ms" Server listening on: "http://localhost:7700" Environment: "development" Commit SHA: &quo…

【笔记】Anaconda 重装后虚拟环境写入路径异常的完整排查与解决过程

Anaconda 安装[仅为当前用户安装/为所有用户安装]选项对环境变量设置的影响_anaconda没有添加环境变量-CSDN博客 Anaconda 路径治理指南&#xff1a;路径精简、权限优化与环境隔离-CSDN博客 Windows系统下手动升级Anaconda的详细指南_anaconda升级-CSDN博客 Conda 命令大全&…

QuecPython-正则表达式

该模块通过正则表达式匹配数据。目前支持的操作符较少&#xff0c;部分操作符暂不支持。示例&#xff1a;import ureres $GNRMC,133648.00,A,3149.2969,N,11706.9027,E,0.055,,311020,,,A,V*18 $GNGGA,133648.00,3149.2969,N,11706.9027,E,1,24,1.03,88.9,M,,M,,*6C $GNGLL,3…

QT窗口(3)-状态栏

QT窗口&#xff08;3&#xff09;-状态栏 状态栏 代码如下&#xff1a;//存在就获取&#xff0c;不存在就创建QStatusBar*statusBarthis->statusBar();this->setStatusBar(statusBar);//显示一个临时消息statusBar->showMessage("这是一个状态消息");运行结…

更具个性的域名:解锁互联网多元价值的钥匙

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

深度学习模块实践手册(第十一期)

46、缩放点积注意力模块论文《Attention Is All You Need》1、作用&#xff1a; 缩放点积注意力&#xff08;Scaled Dot-Product Attention&#xff09;是 Transformer 模型的核心组件&#xff0c;旨在解决序列建模中长距离依赖关系捕捉的问题。传统的循环神经网络&#xff08;…

C++高级技术详解

C高级技术详解 目录 模板 (Templates)右值和移动语义 (Rvalue and Move Semantics)定位 new (Placement new)强类型 (Strong Types)智能指针 (Smart Pointers)容器和算法 (Containers and Algorithms)Lambda表达式常量表达式 (constexpr)多线程和并发 (Multithreading and Co…

跨境卖家紧急自查,Endryko Karmadi四季版画版权维权

25年7月2日&#xff0c;Keith律所代理印尼艺术家Endryko Karmadi发起全新版权维权行动。案件基本情况&#xff1a;起诉时间&#xff1a;2025-7-2案件号&#xff1a;25-cv-07436品牌&#xff1a;Endryko Karmadi Work原告&#xff1a;Endryko Karmadi 原告律所&#xff1a;keith…

M3088NL是一款网络滤波器/变压器支持100M和1000M网络环境,适用于高速网络传输场景M3088

M3088NL是一款网络滤波器/变压器&#xff0c;主要特点如下&#xff1a;兼容性 支持100M和1000M网络环境&#xff0c;适用于高速网络传输场景。 ‌封装形式 采用SOP/SOIC封装&#xff0c;便于电路集成。 ‌应用场景 常用于网络电话、开关电源等需要稳定电流的设备&#xff0c;符…

PyQt动态布局管理器:QSplitter详细指南

PyQt动态布局管理器&#xff1a;QSplitter详细指南 QSplitter简介 在PyQt中&#xff0c;除了常见的QVBoxLayout、QHBoxLayout等静态布局管理器外&#xff0c;QSplitter提供了一种动态布局解决方案。QSplitter允许用户通过拖拽分隔条来实时调整控件大小&#xff0c;为应用程序提…

Java设计模式之行为型模式(备忘录模式)实现方式详解

最近看到一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 一、基础实现结构 角色定义与代码骨架 备忘录模式包含三个核心角色&#xff0c;其协作关系如下&#xff1a; Originator&#xff08;发起人&…

k8s:离线部署tomcatV11.0.9,报Cannot find /opt/bitnami/tomcat/bin/setclasspath.sh

本文记录了在离线环境下部署Tomcat容器时遇到的权限问题及解决方案。在Docker环境中运行Tomcat时出现&quot;找不到setclasspath.sh&quot;错误&#xff0c;通过添加--security-opt seccompunconfined参数解决。在Kubernetes环境中部署时出现相同问题&#xff0c;通过设置…

Linux操作系统之线程(五):线程封装

目录 前言 一、线程ID及进程地址空间布局 二、线程栈与线程局部存储 三、线程封装 总结&#xff1a; 前言 我们在上篇文章着重给大家说了一下线程的控制的有关知识。 但是如果我们要使用线程&#xff0c;就得那这pthread_create接口直接用吗&#xff1f;这样岂不是太过麻…

【物理与机器学习】从非平衡热力学到扩散模型

[toc] 0.引子:从非平衡热力学开始 1.架构简介 2.反向过程的具体推导与 DDPM 改进摘要&#xff1a;扩散模型将非平衡热力学的“噪声注入—去噪逆转”理念注入生成建模中。DDPM&#xff08;Denoising Diffusion Probabilistic Models&#xff09;在 SD2015 的基础上&#xff0c;通…

Git常用命令详解:从入门到精通

前言 Git作为当今最流行的分布式版本控制系统&#xff0c;已经成为开发者必备的技能之一。无论你是独立开发者还是团队协作&#xff0c;掌握Git的基本操作都能极大提高工作效率。本文将详细介绍Git的常用命令&#xff0c;帮助你快速上手并精通Git的基本使用。 一、Git基础概念…

Vue-22-通过flask接口提供的数据使用plotly.js绘图(一)

文章目录 1 任务背景 2 Flask提供接口(server.py) 2.1 原始代码 2.2 跨域问题 3 Vue3获取数据并渲染Plotly图表 3.1 新建工程 3.2 程序 3.2.1 index.html(入口) 3.2.2 cpmponents/Plot.vue(子组件) 3.2.3 App.vue(父组件) 3.2.4 main.ts 3.3 展示 4 选择图表类型绘图 4.1 App.v…

【mysql】换主键

需求&#xff1a;曲库表的主键错了&#xff0c;原先设置的是(sang_id),应该设置为&#xff08;sang_name,singer&#xff09;联合主键。-- &#xff08;0&#xff09;先备份数据&#xff0c;我这里没备份 -- &#xff08;1&#xff09;进行主键的切换之前&#xff0c;要进行一些…

Redis原理之缓存

上篇文章&#xff1a; Redis原理之集群https://blog.csdn.net/sniper_fandc/article/details/149141342?fromshareblogdetail&sharetypeblogdetail&sharerId149141342&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目录 1 Redis作为MySQL…

关于集合的底层数据结构

单列集合Collection分为list集合和set集合list集合分为ArrayList和LinkedListArrayList--底层数据结构是数组1.通过索引查询快2.增删要重构索引,增删慢 LinkedList--底层数据结构是链表1.无索引查询慢2.通过改变前节点的尾指针和后节点的前指针指向可快速增删,增删快set集合(…

批量插入技巧:减少事务提交次数的性能提升

一、事务提交成本分析每次事务提交触发‌磁盘I/O同步‌&#xff08;WAL机制&#xff09;、‌日志写入‌和‌锁资源释放‌操作&#xff0c;高频独立提交会产生指数级开销‌。实验表明&#xff1a;MySQL提交1万次单条插入比单次批量插入‌慢20倍以上‌‌。高频提交还加剧锁竞争与…