序效率大比拼,位翻轉(zhuǎn)程序
在單片機(jī)控制程序中,往往會(huì)用到位翻轉(zhuǎn)程序,例如點(diǎn)陣的控制,圖形的處理,FFT運(yùn)算等。那么,在C語言中如何才能寫出高效率的程序呢?今日在keil的論壇中看到有網(wǎng)友提及這個(gè)程序,又在ourdev論壇搜索了一下,將老外寫的,網(wǎng)友寫的,我自己寫的程序做了一個(gè)全方位的測試,結(jié)果如下所示:
首先是老外的程序:
作者:Concepcion Marco Valero
#include reg52.h>
unsigned char mr;
unsigned char invertir_byte (mr) {
mr = (mr 0x0F) 4 | (mr 0xF0) >> 4;
mr = (mr 0x33) 2 | (mr 0xCC) >> 2;
mr = (mr 0x55) 1 | (mr 0xAA) >> 1;
return (mr);
}
void main()
{
while(1)
{
P1=invertir_byte(0x33);
}
}
Program Size: data=10.0 xdata=0 code=123
完成位交換需要 121 個(gè)時(shí)鐘周期。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第二個(gè)程序:我寫的
#include reg52.h>
unsigned char mr;
unsigned char invertir_byte (mr) {
unsigned char temp;
if(mr0x80){temp=temp|0x01;}
if(mr0x40){temp=temp|0x02;}
if(mr0x20){temp=temp|0x04;}
if(mr0x10){temp=temp|0x08;}
if(mr0x08){temp=temp|0x10;}
if(mr0x04){temp=temp|0x20;}
if(mr0x02){temp=temp|0x40;}
if(mr0x01){temp=temp|0x80;}
return (temp);
}
void main()
{
while(1)
{
P1=invertir_byte(0x33);
}
}
Program Size: data=10.0 xdata=0 code=85
完成位交換需要 42 個(gè)時(shí)鐘周期。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第三個(gè)程序:還是我寫的
#include reg52.h>
unsigned char mr;
unsigned char invertir_byte (mr) {
bit tempb;
unsigned char count,temp;
for(count=8;count;count--)
{
tempb=mr0x01;
mr>>=1;
temp=1;
temp=temp|tempb;
}
return (temp);
}
void main()
{
while(1)
{
P1=invertir_byte(0x33);
}
}
Program Size: data=12.1 xdata=0 code=64
完成位交換需要 175 個(gè)時(shí)鐘周期
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第三個(gè)程序:還是我寫的
#include reg52.h>
unsigned char mr;
unsigned char invertir_byte (mr) {
bit tempb;
unsigned char count,temp;
for(count=8;count;count--)
{
tempb=mr0x01;
mr>>=1;
temp=1;
temp=temp|tempb;
}
return (temp);
}
void main()
{
while(1)
{
P1=invertir_byte(0x33);
}
}
Program Size: data=12.1 xdata=0 code=64
完成位交換需要 175 個(gè)時(shí)鐘周期
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第四個(gè)程序:還是我寫的
#include reg52.h>
unsigned char bdata temp;
sbit D0=temp^0;
sbit D1=temp^1;
sbit D2=temp^2;
sbit D3=temp^3;
sbit D4=temp^4;
sbit D5=temp^5;
sbit D6=temp^6;
sbit D7=temp^7;
unsigned char invertir_byte (unsigned char mr)
{
D7=mr0x01;
D6=mr0x02;
D5=mr0x04;
D4=mr0x08;
D3=mr0x10;
D2=mr0x20;
D1=mr0x40;
D0=mr0x80;
return (temp);
}
void main()
{
while(1)
{
P1=invertir_byte(0x33);
}
}
Program Size: data=10.0 xdata=0 code=59
完成位交換需要 35個(gè)時(shí)鐘周期
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第五個(gè)程序:Jon Ward
##include reg52.h>
unsigned char bdata src;
sbit S0=src^0;
sbit S1=src^1;
sbit S2=src^2;
sbit S3=src^3;
sbit S4=src^4;
sbit S5=src^5;
sbit S6=src^6;
sbit S7=src^7;
unsigned char bdata dst;
sbit D0=dst^0;
sbit D1=dst^1;
sbit D2=dst^2;
sbit D3=dst^3;
sbit D4=dst^4;
sbit D5=dst^5;
sbit D6=dst^6;
sbit D7=dst^7;
unsigned char invertir_byte (unsigned char mr)
{
src=mr;
D0=S7;
D1=S6;
D2=S5;
D3=S4;
D4=S3;
D5=S2;
D6=S1;
D7=S0;
return(dst);
}
void main()
{
while(1)
{
P1=invertir_byte(0x33);
}
}
//cost 35 machine cycle
//Program Size: data=11.0 xdata=0 code=61
完成位交換需要 35個(gè)時(shí)鐘周期
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第六個(gè)程序:來自O(shè)urdev論壇的網(wǎng)友
#include reg52.h>
unsigned char invertir_byte (unsigned char val)
{
unsigned char dat_b ,i;
dat_b=0x00;
for(i=0;i=7;i++)
{
dat_b=dat_b|((val>>i)0x01);
if(i==7)break;
dat_b=dat_b1;
}
val=dat_b;
return(val);
}
void main()
{
while(1)
{
P1=invertir_byte(0x33);
}
}
287 cycle
Program Size: data=9.0 xdata=0 code=57
完成位交換需要 287個(gè)時(shí)鐘周期
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第七個(gè)程序:來自ourdev論壇的網(wǎng)友
#include reg52.h>
unsigned char code tab[16]={0x00,0x08,0x04,0x0c,0x02,0x0a,0x06,0x0e,
0x01,0x09,0x05,0x0d,0x03,0x0b,0x07,0x0f};
unsigned char invertir_byte (unsigned char dat)
{
dat = tab[(dat 0xf0)>>4] | (tab[dat 0x0f]4);
return dat;
}
void main()
{
while(1)
{
P1=invertir_byte(0x33);
}
}
//cost 26 machine cycle
//Program Size: data=9.0 xdata=0 code=63
完成位交換需要 26 個(gè)時(shí)鐘周期
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
第八個(gè)程序:來自ourdev網(wǎng)友
#includeAT89X51.H>
unsigned char byte_bit_swap(unsigned char a)
{
a = ((a 0x0F) 4) | ((a 0xF0) >> 4);
a = ((a 2) 0xcc) | ((a>> 2) 0x33);
a = ((a 1) 0xaa) | ((a>> 1) 0x55);
return(a);
}
void main(void)
{
while(1)
{
P1=byte_bit_swap(0x33);
}
}
Program Size: data=9.0 xdata=0 code=66
完成位交換需要 37 個(gè)時(shí)鐘周期
評(píng)論