即对从大到小或从小到大排列的数组中数进行查找时用到的搜索方法
我是在对应热敏电阻阻值与实际温度值时用到
一维数组,标号代表温度,间隔为1,所以正好,每个数组内容对应该阻值下的温度
得到热敏电阻阻值后,开始从中间开始比大小,大了,把低端的指针指向数组中间的数据地址,小了则把高端的指针指向中点
然后再循环比较下去,会有两种情况
1、中间的数刚好跟比较的数相等,那么可以推出循环了
2、数组中没有与比较的数相等的数,那么这个比较的数会处在某两个数之间,可以用中位值代替,或者拟合啥的
附一个C语言的函数代码:
static void Lookup_TAB(Uint16 data,const Uint16 *TABLE,Uint16 *aptr)
{
register Uint16 i;
Uint16 *eptr=(Uint16 *)&TABLE[101]; //高端指针 高低端指针即每次折半后数据范围的两头地址
Uint16 *sptr=(Uint16 *)TABLE; //低端指针
Uint16 *ptr; //查数指针
for(i=0;i<8;i++) //搜索全表
{
ptr = (Uint16 *)((Uint16)sptr+(((Uint16)(eptr-sptr))>>1));//数组的地址是连续的;
if(*ptr>data) sptr = ptr;
else if(*ptr<data) eptr = ptr;
else //查到相等的节点
{
aptr[2] = *ptr; //Y1
aptr[1] = *(ptr+1); //Y2
aptr[0] = (Uint16)(ptr-TABLE)*10;//X1*10;放大10倍
break;
}
if(eptr-sptr==1) //查到节点的范围
{
aptr[2] = *sptr; //Y1
aptr[1] = *eptr; //Y2
aptr[0] = (Uint16)(sptr-TABLE)*10+(*sptr-data)*10/(*sptr-*eptr);//X1*10+(y-y1)*10/(y2-y1);放大10倍,这样就将温度精度提高到一个小数位;
break;
}
}
}