利用“整除求商求余”来拆分提取一个数的个十百千位。
上两节讲了整除的求商求余运算符,这两个运算不仅能用在数学运算中,还可以用来拆分提取一个数的个十百千位。提取这些位有什么用呢?因为在以后的单片机显示程序中,不管是液晶屏还是数码管,必须用到这种提取算法,先把一个数的个十百千位一个个拆分提取出来,然后再送到显示屏上显示,所以这种算法很常见和实用。上述提到的“个,十,百,千”位只是一个虚数,具体是多少应该根据实际项目而定,也有可能是“个,十,百,千,万,十万,百万...”等位,但是处理的思路和方法都是一致的。
拆分提取的思路。比如8562这个数,千位是8,百位是5,十位是6,个位是2。可以依次看成是:
8=8562/1000;
5=562/100;
6=62/10;
2=2/1;
复制代码
上述用到了整除求商,但是562,62,2又是如何通过8562分解得到的呢?需要用到整除求余:
562=8562%1000;
62=8562%100;
2=8562%10;
复制代码
最后综合在一起,连在一起写:
8=8562/1000;
5=8562%1000/100;
6=8562%100/10;
2=8562%10/1;
复制代码
因为我们预先知道了这个数最大位是千位,所以千位直接整除1000求商就可以了。实际项目中,我们只是用某个变量,而这个变量的大小我们并不知道具体是什么,它的最大位可能并不止千位,也有可能是万位,所以需要把上述最高位的千位也做一下整除10000求余数,然后在整除1000求商,最后整理如下:
8=8562%10000/1000;
5=8562%1000/100;
6=8562%100/10;
2=8562%10/1;
复制代码
大家仔细观察和品味一下,很容易发现规律和原因,如果求万,十万,百万,也是用一样的方法。多提醒一句,根据我的经验,有一些单片机的C编译器可能不支持long类型数据的求余求商连写在一起,那么就要用一个中间变量分两步走,先求余,再求商,分开来操作。比如:
8=8562%10000/1000;
复制代码
分成两步走:
a=8562%10000;
a=a/1000;
复制代码
上述的变量a就是引入的中间变量。
现在编写一个程序来练习刚才讲到的内容,最后把程序编译后下载到坚鸿51学习板观察结果。请直接复制第十节模板程序,修改的main程序代码如下:
void main() //主程序
{
/*---C语言学习区域的开始---------------------------------------------------------------------------*/
unsigned char a;
unsigned char b;
unsigned char c;
unsigned char d;
unsigned int x=8562; //初始化为8562,注意必须是int类型以上,不能是char类型,char最大范围是255。
a=x%10000/1000; //拆分提取千位
b=x%1000/100; //拆分提取百位
c=x%100/10; //拆分提取十位
d=x%10/1; //拆分提取个位
GuiWdData0=a; //把a这个变量放到窗口变量0里面显示
GuiWdData1=b; //把b这个变量放到窗口变量1里面显示
GuiWdData2=c; //把c这个变量放到窗口变量2里面显示
GuiWdData3=d; //把d这个变量放到窗口变量3里面显示
/*---C语言学习区域的结束---------------------------------------------------------------------------*/
while(1)
{
initial();
key_service();
display_service();
}
}
复制代码
查看运算结果的方法。如何在坚鸿51学习板上观察变量?按下S1或者S5按键即可切换显示不同的窗口,从而显示不同的变量。按下S9按键不松手就可以切换到十六进制的显示界面,松开手后会自动切换到十进制的界面。上坚鸿51学习板观察程序执行的结果如下:
变量a为8。
变量b为5。
变量c为6。
变量d为2。
下节预告:逻辑运算符的“与”运算。
(未完待续)转载
|