显示个位、十位、百位
问题:
a范围为0~255,将其值显示到数码管或LCD上。
算法1:
百位:a /100
十位:a %100 / 10
个位:a % 10
算法2:
if(200 < a) 百位为2,a -= 200;
else if(100 < a) 百位为1,a -= 100;
else 百位为0。
if(90 <= a) 十位为9,a -= 90;个位此时为a
else if(80 <= a) 十位为8,a -= 80;个位此时为a
else if(70 <= a) 十位为7,a -= 70;个位此时为a
...
...
else if(10 <= a) 十位为1,a -= 10;个位此时为a
else 十位为0,个位此时为a
算法3:
位权 128 64 32 16 8 4 2 1
0xFF = 1 1 1 1 1 1 1 1
254 = 0xFE = 1111 1110 = 1*128+1*64+1*32+1*16+1*8+1*4+1*2+0*1。
位权表:
uint8_t bit_table[][3] =
{
0,0,1,
0,0,2,
0,0,4,
0,0,8,
0,1,6,
0,3,2,
0,6,4,
1,2,8
};
第3列数加起来为个位,超过10则进1,第2列数加起来为十位,超过10则进1,第1列数加起来为百位。
for(i=0;i<8;i++)
{
if(val & 0x01)
{
asc[2] += bit_table[i][2];//个位
if(10 <= asc[2]) {asc[2] -= 10;asc[1]+=1;}//逢10进1
asc[1] += bit_table[i][1];//十位
if(10 <= asc[1]) {asc[1] -= 10;asc[0]+=1;}//逢10进1
asc[0] += bit_table[i][0];//百位
}
val >>= 1;
}
asc[0] += 0x30;//百位,转ASCII
asc[1] += 0x30;//十位,转ASCII
asc[2] += 0x30;//个位,转ASCII
优化:
//位权表
const static uint8_t bit_table[ ] = {1,2,4,8,6,2,4,8,1,3,6,2,1};
asc[0] = 0;
asc[1] = 0;
asc[2] = 0;
for(i = 0; i < 8; i ++)
{
if(val & 0x01)
{
switch(i)
{
case 7:asc[0] += bit_table[i + 5];
case 6:if(10 <= asc[1]) {asc[1] -= 10;asc[0]+=1;}
case 5:
case 4:asc[1] += bit_table[i + 4];
case 3:if(10 <= asc[2]){asc[2] -= 10;asc[1]+=1;}
default:asc[2] += bit_table[i];break;
}
}
val >>= 1;
}
if(10 <= asc[2]) {asc[2] -= 10;asc[1]+=1;}
if(10 <= asc[1]) {asc[1] -= 10;asc[0]+=1;}
asc[0] += 0x30;
asc[1] += 0x30;
asc[2] += 0x30;

浙公网安备 33010602011771号