关于汇编语言位图的个人看法

本文介绍了一种判断数值是否能有效利用位图进行存储的方法。通过观察二进制表示中的1或0的数量,并确保这些位能在八位内表示,即可确定数值是否适合位图存储。文章还分享了一个具体案例,展示了编译器如何处理特定数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        今日学习了汇编语言,但对其中的位图并不十分了解,网络上有对这些进行解析,基本还是很符合规则的;但我关心的是,怎么快速准确知道某个数是否符合位图,我刚自己验证的方法,目前正确的概率还是100%。

       我的方法是在网络上一个方法方法上改进的,网络上方法描述:先将数据转换成二进制,然后统计1的个数,如果个数小于8,且这些1都可以同时放在八位中,这两个条件都符合基本是可以符合位图的;

       但此方法有漏洞,如果细心的人可以发现,0XFFFFFF,也是符合位图的,但一个的个数有24个;0XFFFFFFFF,也是符合位图,但1的个数有32个;但0XFFFF,却不符合位图;为什么呢?

       我经过验证得到改进的判定方式,我是在Keil MDK上验证的,其余编译器是否一样,我就不能保证了;

       其实编译器十分的灵活,不但可以存储符合位图的数据,而且对初步不符合的数据它会进行操作,至于进行哪些操作呢,“移位”大家都是知道,但还有一个就是“取反”;也就是说0XFFFFFF这个数据,编译器是取反后进行存储的;不信的可以做下如下实验:

写入一下代码:

                MOV R1, #0xffffff
                MOV R2, #0xff

执行后,可以看到编译器的处理结果如下:

    23:         MOV R1, #0xffffff
0x00000000  E3E014FF  MVN       R1,#0xFF000000

 
    24:         MOV R2,#0xff
    25: 
0x00000004  E3A020FF  MOV       R2,#0x000000FF

 发现没:第一条代码编译器翻译为MVN存储;

 

因此我总结的方法:

1.先将数据转换成二进制

2.然后统计1的个数或0的个数

3.这些数据距离在八位以内

 

如果,以上三个条件符合,那么可以使用位图存储;

以上仅是个人的小理解,有不当之处,烦请指教

      

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值