ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何在Mounriver编译器中开启64位运算以及如何用32位机转换11字节的手机号为二进制数

2022-07-21 18:01:14  阅读:193  来源: 互联网

标签:11 967 32 编译器 000 111 296 294


遇到一个很有意思的问题:582m芯片,默认用32位计算,而无符号32位二进制数据,最多可以存放的十进制数为4,294,967,295,是个4开头的10位十进制数,若要存放11位数,最好能支持64位运算,直接转换就好了。那么如何将11位的手机号转换为2个32位的无符号二进制32_L和32_H存放呢。

582m不是不可以使用64位计算,可以右键点击工程选择最后一项Properties,去掉下图中的勾选来实现。但是库会变大,会占用更多的flash和ram,如果想节省这些开销,只好用32位计算去实现。先提供一个思路,C代码等有时间了再补上。

总体思路:手机号码可以视作1开头的11位数,那么用无符号32位二进制数的最大值,“预处理”一下手机号码,看看能分出去几个4,294,967,296,剩下的数就好用32位计算了。

字符串转换十进制数过程先省略,视作十进制数。比如说如数手机号码为字符串“12,811,111,111”,先“预处理”一下,能减掉2个4,294,967,296,就知道32_H的数值应该是2了。

要是能算12,811,111,111 - 2 * 4,294,967,296 = 4,221,176,521 < 4,294,967,296,岂不是得用64位机?

观察一下4,294,967,296这个数据,离4,300,000,000很近,差值为5,032,704,那么可以用4,300,000,000去“预处理”。这个过程中注意“预处理”时,4,300,000,000的倍数与实际值间差值较小时的问题,会在下文提出分析。

预先设置两个字符串,“12,884,901,888” (4,294,967,296 * 3 = 12,884,901,888)和“17,179,869,184”(4,294,967,296 * 4 = 17,179,869,184),以帮助我们划分32_L与32_H的界限。

输入一串1开头的11位的字符串,可以从十进制的从高到低,即字符串首地址偏移的从小到大,按字符值逐个比较,可以帮助判断32_H的值。

比如说对于字符串“12,811,111,111”,从十进制的高位到低位,逐个字符比较,发现前三个数是相等的,第四个数 '1' < '8',故判断为小于3倍的4,294,967,296,可以先转换前3位为十进制数128,128 - 2 * 43 = 42 < 43 ,这个表达式可以由32位机处理。再把"42"放回字符串,得到“4,211,111,111”,再转换十进制,加上用4,300,000,000“预处理”时的差值2 * 5,032,704 = 4,221,176,519,这个数就在32位机处理范围内了,可以转换成32位二进制数作为32_L。

但是对于字符串“12,899,999,999”,比对一下高几位,发现大于3倍的4,294,967,296,“预处理”时发现128 - 3 * 43为负数,不够减的。那么这个时候需要再处理一下,发现大于3倍的4,294,967,296时,32_H值为3没问题,还需要判断一下前三位是不是小于3 * 43,若小于,则直接忽略高三位,用99,999,999 - 84,901,888 = 15,098,111,这个值作为32_L。

 

标签:11,967,32,编译器,000,111,296,294
来源: https://www.cnblogs.com/JayWellsBlog/p/16502041.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有