开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 321|回复: 10
收起左侧

[易语言纯源码] 位运算压缩整数五合一(6位/值,范围 -32 ~ +31)

[复制链接]
结帖率:60% (3/5)
发表于 昨天 09:25 | 显示全部楼层 |阅读模式   广东省深圳市
分享源码
界面截图: -
是否带模块: -
备注说明: -
用于传参偷懒

问:用这个压缩值多线程传参,会丢数据吗?
答:不会
问:可以调整范围吗?
答:可以的,把代码扔给ai,让他调整,比如说范围调成 -5 ~ +58


  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
m_压缩值整数型  

子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
值1整数型 
值2整数型 
值3整数型 
值4整数型 
值5整数型 
结果文本文本型 
' ===== 测试数据(范围 -32 ~ +31)=====
值1 = -32
值2 = 31
值3 = 0
值4 = -1
值5 = 15
' ===== 压缩(5合1)=====
m_压缩值 = 压缩五合一 (值1, 值2, 值3, 值4, 值5)
' ===== 解压 =====
解压五合一 (m_压缩值, 值1, 值2, 值3, 值4, 值5)
结果文本 = “原始值: ”到文本 (值1)“, ”到文本 (值2)“, ”到文本 (值3)“, ”到文本 (值4)“, ”到文本 (值5)#换行符
结果文本 = 结果文本 + “压缩后(仅1个整数): ”到文本 (m_压缩值)#换行符
调试输出 (结果文本)
连续赋值 (0, 值1, 值2, 值3, 值4, 值5)
解压五合一 (m_压缩值, 值1, 值2, 值3, 值4, 值5)
结果文本 = “解压值: ”到文本 (值1)“, ”到文本 (值2)“, ”到文本 (值3)“, ”到文本 (值4)“, ”到文本 (值5)#换行符
调试输出 (结果文本)
子程序名返回值类型公开备 注
压缩五合一整数型 
参数名类 型参考可空数组备 注
值1整数型
值2整数型
值3整数型
值4整数型
值5整数型
' 偏移 +32:将 -32~+31 转为 0~63(6位无符号)
' 拼接:v1占bit0~5, v2占bit6~11, v3占bit12~17, v4占bit18~23, v5占bit24~29
返回 (位或 (位或 (位或 (位或 (值1 + 32, 左移 (值2 + 32, 6)), 左移 (值3 + 32, 12)), 左移 (值4 + 32, 18)), 左移 (值5 + 32, 24)))
子程序名返回值类型公开备 注
解压五合一 一次性解压出5个值
参数名类 型参考可空数组备 注
压缩值整数型
值1整数型
值2整数型
值3整数型
值4整数型
值5整数型
值1 = 位与 (压缩值, 63) - 32
值2 = 位与 (右移 (压缩值, 6), 63) - 32
值3 = 位与 (右移 (压缩值, 12), 63) - 32
值4 = 位与 (右移 (压缩值, 18), 63) - 32
值5 = 位与 (右移 (压缩值, 24), 63) - 32


i支持库列表   支持库注释   
spec特殊功能支持库

评分

参与人数 2好评 +1 精币 +6 收起 理由
kyo9766 + 1 感谢分享,很给力!~
文西哥 + 1 + 5 支持开源~!感谢分享

查看全部评分


结帖率:100% (8/8)

签到天数: 28 天

发表于 昨天 12:22 | 显示全部楼层   广东省东莞市
AI了一下这代码 还挺实用
这段代码是典型的位打包(Bit Packing)技术,用一个整数存储5个范围在 -32~+31 的小整数,再通过位移和位与操作解压还原。这种手法在易语言(及所有编程语言)中主要应用于以下场景:

1. 网络传输 / 通信协议
  • 在网络包(如TCP/UDP)中,为了减少传输字节数,把多个状态或参数压缩到一个整型字段里发送。
  • 例如:游戏中的玩家坐标偏移、方向、动作编号等,每个只占6位(0~63),5个合起来仅占30位,一个32位整数即可携带,比分别传5个整数节省约80%流量。

2. 内存优化 / 数据结构精简
  • 当需要存储大量记录(如数组、列表)时,每个记录由多个小范围数值组成,如果每个字段都用独立的整数(32位)保存,内存消耗巨大。
  • 使用位打包后,一条记录只占一个整数,适合做缓存、日志压缩或内存数据库中的紧凑存储。

3. 数据库字段压缩
  • 在数据库表中,如果想将多个枚举值、状态标志或小数字合并到一个列中(例如一个 INT 字段),可以减少表列数,提高cha询效率,同时节省磁盘空间。
  • 常见于配置表、角色属性存档等。

4. 游戏开发中的状态存储
  • 角色属性(如血量百分比、技能冷却等级、方向、武器类型等),每项数值通常很小,可压缩到一个变量中,便于快速读写和存档。
  • 例如:Unity或Cocos中也会用类似技巧优化Prefab或网络同步数据。

5. 嵌入式系统 / 硬件交互
  • 单片机或传感器传回的数据常采用位域(bit-field)格式,每个位代表一个开关或小数值。易语言通过位操作模拟这种底层协议,直接解析硬件数据包。

6. 加密 / 哈希 / 校验
  • 将多个输入值混合成一个值,可用于生成校验码、简单哈希或混淆数据(虽然不是安全加密,但可作为轻量级编码)。

7. 易语言特有的场景
  • 易语言常用于Windows桌面管理工具、自动化脚本、中小型软件。在界面编程中,可能需要将多个控件状态(如复选框选中、下拉框索引、数值调节器值)合并到一个配置项中保存,简化注册表或配置文件的内容。


注意事项
  • 该方案要求每个数值必须严格在 -32~+31 之间(偏移后为0~63),否则会溢出或丢失精度。
  • 适合数值范围固定且较小的情况,若范围可变,应改用其他压缩算法(如Huffman、ZLIB)。

这种“以位换空间”的思路,是程序优化中很实用的技巧,尤其在资源受限或高吞吐场景下非常常见。

回复 支持 反对

使用道具 举报

结帖率:96% (503/523)

签到天数: 25 天

发表于 4 小时前 | 显示全部楼层   内蒙古自治区乌海市
感谢分享
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 昨天 20:44 | 显示全部楼层   江苏省连云港市

谢谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 28 天

发表于 昨天 19:16 | 显示全部楼层   四川省泸州市
易造轮 发表于 2026-7-28 18:19
这个能搞不
不知为啥 短文本拼接用加号更快 【文本a + 文本b + 文.....
https://bbs.ijingyi.c ...
  
子程序名返回值类型公开备 注
创建字节集指针整数型 创建动态缓冲区结构,返回结构指针(+0数据指针 +4数据长度 +8空间大小 +12堆句柄)
参数名类 型参考可空数组备 注
申请长度整数型初始缓冲区大小(默认1024字节)
变量名类 型静态数组备 注
原堆句柄整数型 
数据指针整数型 
结构指针整数型 
如果真 (申请长度 ≤ 0)
申请长度 = 1024
原堆句柄 = GetProcessHeap ()
数据指针 = HeapAlloc (原堆句柄, #HEAP_ZERO_MEMORY, 申请长度)
结构指针 = HeapAlloc (原堆句柄, #HEAP_ZERO_MEMORY, 16)
_Set (结构指针, #结构_数据大小, 0)  ' 已用长度初始为0,避免分配时清零失败
_Set (结构指针, #结构_数据指针, 数据指针)  ' 写入数据指针
_Set (结构指针, #结构_空间大小, 申请长度)  ' 写入空间大小
_Set (结构指针, #结构_原堆句柄, 原堆句柄)  ' 写入原堆句柄
返回 (结构指针)
子程序名返回值类型公开备 注
释放字节集指针 释放动态缓冲区结构及内部数据内存
参数名类 型参考可空数组备 注
结构指针整数型由“创建字节集指针”返回的结构指针
变量名类 型静态数组备 注
原堆句柄整数型 
数据指针整数型 
原堆句柄 = _Get (结构指针, #结构_原堆句柄 )
数据指针 = _Get (结构指针, #结构_数据指针 )
如果真 (数据指针 ≠ 0)
HeapFree (原堆句柄, 0, 数据指针)
HeapFree (原堆句柄, 0, 结构指针)
子程序名返回值类型公开备 注
分配字节集指针逻辑型 为动态缓冲区扩容(倍增策略,确保至少能追加指定字节数)
参数名类 型参考可空数组备 注
结构指针整数型结构指针
数据长度整数型需要追加的字节数
变量名类 型静态数组备 注
原堆句柄整数型 
数据指针整数型 
分配大小整数型 
分配指针整数型 
原堆句柄 = _Get (结构指针, #结构_原堆句柄 )
数据指针 = _Get (结构指针, #结构_数据指针 )
分配大小 (_Get (结构指针, #结构_数据大小 ) + 数据长度) × 2
分配指针 = HeapReAlloc (原堆句柄, #HEAP_REALLOC_IN_PLACE_ONLY, 数据指针, 分配大小)  ' 尝试追加空间,失败返回0,不会修改原有数据
如果真 (分配指针 = 0)  ' 原地扩展失败,改用普通 HeapReAlloc(允许移动)
分配指针 = HeapReAlloc (原堆句柄, 0, 数据指针, 分配大小)
如果真 (分配指针 = 0)  ' 分配成功,写入新数据指针,新数据大小,新空间大小
返回 ()

_Set (结构指针, #结构_数据指针, 分配指针)  ' 写入数据指针
_Set (结构指针, #结构_空间大小, 分配大小)  ' 写入当前堆大小
返回 ()
子程序名返回值类型公开备 注
清空字节集数据 
参数名类 型参考可空数组备 注
结构指针整数型结构指针
RtlZeroMemory (_Get (结构指针, #结构_数据指针 ), _Get (结构指针, #结构_数据大小 ))
_Set (结构指针, #结构_数据大小, 0)
_Set (结构指针, #结构_上传大小, 0)
子程序名返回值类型公开备 注
字节集读取_指针整数型 将动态缓冲区指定内存块追加到指定指针
参数名类 型参考可空数组备 注
结构指针整数型结构指针
追加指针整数型待追加数据的指针
追加长度整数型待追加数据的字节数
变量名类 型静态数组备 注
原上传大小整数型 
原数据大小整数型 
原数据指针整数型 
剩余长度整数型 
上传长度整数型 
原上传大小 = _Get (结构指针, #结构_上传大小 )
原数据大小 = _Get (结构指针, #结构_数据大小 )
剩余长度 = 原数据大小 - 原上传大小
如果真 (剩余长度 > 0)
原数据指针 = _Get (结构指针, #结构_数据指针 )
上传长度 = 选择 (追加长度 > 剩余长度, 剩余长度, 追加长度)
RtlMoveMemory (追加指针, 原数据指针 + 原上传大小, 上传长度)
_Set (结构指针, #结构_上传大小, 原上传大小 + 上传长度)
返回 (上传长度)
返回 (0)
子程序名返回值类型公开备 注
字节集追加_指针逻辑型 将指定内存块追加到动态缓冲区末尾(自动扩容)
参数名类 型参考可空数组备 注
结构指针整数型结构指针
追加指针整数型待追加数据的指针
追加长度整数型待追加数据的字节数
变量名类 型静态数组备 注
原空间大小整数型 
原数据大小整数型 
新数据大小整数型 
原数据指针整数型 
原数据大小 = _Get (结构指针, #结构_数据大小 )
原空间大小 = _Get (结构指针, #结构_空间大小 )
新数据大小 = 原数据大小 + 追加长度
如果真 (新数据大小 > 原空间大小)  ' 空间不够追加,重新分配内存
如果真 (分配字节集指针 (结构指针, 追加长度))
返回 ()

原数据指针 = _Get (结构指针, #结构_数据指针 )  ' 分配字节集指针成功会更新数据指针,需要重新读
RtlMoveMemory (原数据指针 + 原数据大小, 追加指针, 追加长度)
_Set (结构指针, #结构_数据大小, 新数据大小)
返回 ()
子程序名返回值类型公开备 注
字节集追加_字节集逻辑型 将字节集数据追加到动态缓冲区末尾(自动扩容)
参数名类 型参考可空数组备 注
结构指针整数型结构指针
追加数据字节集待追加的字节集
追加长度整数型待追加的字节数
变量名类 型静态数组备 注
原空间大小整数型 
原数据大小整数型 
新数据大小整数型 
如果真 (是否为空 (追加长度))
追加长度 = 取字节集长度 (追加数据)
原数据大小 = _Get (结构指针, #结构_数据大小 )
原空间大小 = _Get (结构指针, #结构_空间大小 )
新数据大小 = 原数据大小 + 追加长度
如果真 (新数据大小 > 原空间大小)  ' 空间不够追加,重新分配内存
如果真 (分配字节集指针 (结构指针, 追加长度))
返回 ()

RtlMoveMemory (_Get (结构指针, #结构_数据指针 ) + 原数据大小, _取指针字节集 (追加数据), 追加长度)
_Set (结构指针, #结构_数据大小, 新数据大小)
返回 ()
子程序名返回值类型公开备 注
字节集追加_文本型逻辑型 将文本型数据追加到动态缓冲区末尾(自动扩容)
参数名类 型参考可空数组备 注
结构指针整数型结构指针
追加数据文本型待追加的文本
追加长度整数型文本的字节数
变量名类 型静态数组备 注
原空间大小整数型 
原数据大小整数型 
新数据大小整数型 
如果真 (是否为空 (追加长度))
追加长度 = 取文本长度 (追加数据)
原数据大小 = _Get (结构指针, #结构_数据大小 )
原空间大小 = _Get (结构指针, #结构_空间大小 )
新数据大小 = 原数据大小 + 追加长度
如果真 (新数据大小 > 原空间大小)  ' 空间不够追加,重新分配内存
如果真 (分配字节集指针 (结构指针, 追加长度))
返回 ()

RtlMoveMemory (_Get (结构指针, #结构_数据指针 ) + 原数据大小, _取指针文本型 (追加数据), 追加长度)
_Set (结构指针, #结构_数据大小, 新数据大小)
返回 ()

这个写法可以参考,类似快速字节集,自己管理堆内存,不用每次都申请,追加空间不够了尝试拓展,拓展不了就新开辟内存,和快速字节集原理一样,这样追加就很快
回复 支持 反对

使用道具 举报

结帖率:60% (3/5)

签到天数: 29 天

 楼主| 发表于 昨天 18:19 | 显示全部楼层   广东省深圳市
伊人独醉 发表于 2026-7-28 16:21
要高效的汇编写法不

这个能搞不
不知为啥 短文本拼接用加号更快 【文本a + 文本b + 文.....
https://bbs.ijingyi.com/forum.php?mod=viewthread&tid=14877902

回复 支持 反对

使用道具 举报

签到天数: 28 天

发表于 昨天 18:16 | 显示全部楼层   河北省石家庄市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 28 天

发表于 昨天 16:21 | 显示全部楼层   四川省泸州市
要高效的汇编写法不
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 19 天

发表于 昨天 15:31 | 显示全部楼层   山东省青岛市
稀奇的知识 又增加了,感谢分享
回复 支持 反对

使用道具 举报

结帖率:57% (13/23)

签到天数: 19 天

发表于 昨天 13:26 | 显示全部楼层   **
谢谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表