Delphi - 位域的解决办法
记得以前在将C++的头文件时候在结构体中有个成员是位域定义,说白了就是将一个字节中的每一位代表什么意思,比如第3位如果为1的话代表代表数据有效,反之为0就是数据无效.
当时没有办法就直接定义一个字节吧,在使用的时候先读出这个字节然后用与运算来判断吧.
最近困在襄樊和河南的一个交界处,偏僻呀,不过也好,没事干的时候可以看看代码吧.
其实在很早之前看JEDI中翻译的Pas文件时候就看到过用Set来表示位域的,当时没有怎么在意,今天在看ObjAuto单元的时候,测试的时候有点儿新的发现:
1 2 3 4 5 | //参数的传值方式 // TParamFlag = (pfVar, pfConst, pfArray, pfAddress, pfReference, pfOut, pfResult); TParamFlags = set of TParamFlag; |
这是集合定义部分.然后我们看看我们的代码吧.
1 2 3 4 5 6 7 8 | procedure TForm3 . btn1Click(Sender: TObject); var p: TParamFlags; begin p:=[pfReference]; p:=[pfVar, pfConst, pfArray, pfAddress, pfReference, pfOut, pfResult]; end ; |
如果我们用ord(pfVar)只能得到0,而且delphi的提示里面也是显示的0.但是这里是用[]括起来的.那么值有没有变化呢?
我们看见eax是$10也就是00010000,这就是[pfReference]的值.光pfReference是他是4,但是用到集合后他就变成了二进制的第五位是1也就是16.
也就是在集合中,每一个元素占一位,元素与元素之间用or连接起来组成一个数.
那么一个集合会有多大呢?其实和它有多少个元素有关系,大小应该整除8 + 1吧.看例子:
在上面的例子中加一句
1 | ShowMessage(IntToStr(SizeOf(p))); |
结果是1,因为TParamFlag 中只有7个元素.
那么我们自己定义一个元素多一点儿的集合来看看吧,
1 2 3 4 5 6 7 8 9 10 11 | type TTest = (t1,t2,t3,t4,t5,t6,t7,t8,t9); TTests = set of TTest; procedure TForm3 . btn4Click(Sender: TObject); var t:TTests; begin ShowMessage(IntToStr(SizeOf(t))); end ; |
现在结果就是2了.
说了这么多,最后就是在结构体或者其他时候要判断某一位是否为一我们只需要
1 | if t1 in t then |
如果是true那么第0位就是1了.
好了要说的就是这么多了.
分类:
Delphi基础
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥