现在的位置: 首页 > 综合 > 正文

source\lib\math1.h.c__常用数学函数

2013年09月23日 ⁄ 综合 ⁄ 共 8698字 ⁄ 字号 评论关闭

/****常用数学函数****/
/*****************************************************************************************
filename: math1.h
文件功能:
编    者:张永辉 2012年11月28日
修    改:张永辉 2013年03月04日
添    加:张永辉 2013年04月02日
                2013年04月22日  添加异或函数
*****************************************************************************************/
#ifndef __MATH_1_H
#define __MATH_1_H
#include "basetype.h"
/****************************************************************************************/
void  MathTest(void);
int   MathCheckEndion(void);                                //检测大小端
char* MathItoa(int intvalue,char * str);                    //整型转字符串
int   MathAtoi(const char * str);                           //字符串转整型
int   MathStrCmp(const char *src ,const char *dst);         //字符串比较大小
char* MathStrCopy(char *src ,const char *dst);              //字符串复制
int   MathStrIsHave(const char *src, const char *dst);      //字符串查找是否有子串
unsigned int MathStrLen(const char *str);                   //字符串长度计算
void *MathMemSet(void *ptr,char c,     unsigned int len);   //内存填充
void *MathMemCopy(void *dest,void *src,unsigned int len);   //内存复制
void *MathMemMove(void *dest,void *src,unsigned int len);   //内存移动
char  MathXor(char *xordata,u32 len);                       //求异或值
/*****************************************************************************************/
#endif

/*****************************************************************************************
filename:math1.c
平    台:VS2008  keillV4
*****************************************************************************************/
#include "math1.h"    //#include  "\embed\source\lib\math1.h"
/*****************************************************************************************
函数功能:                              测试是大端还是小端模式
*****************************************************************************************/
void MathTest(void)
{
    int i = 99;
    char a[12];
    i = MathCheckEndion();
    if(i==0)
    {   //大端模式
        i = 100;
    }else
    {
        //小端模式
        i = 200;
    }
    MathItoa(-1,a);
    MathItoa(0,a);
    MathItoa(2147483647,a);
    MathItoa(-2147483647,a);
    MathItoa(0x80000000,a);
    i = MathStrCmp("a" , "b");          //-1
    i = MathStrCmp("a" , "ac");         //-1
    i = MathStrCmp("abcd" , "abcd");    //0
    i = MathStrLen("");
    i = MathStrLen("asd");
    MathStrCopy(a,"abcdef");
    while(1);
}
/*****************************************************************************************
函数功能:                              测试是大端还是小端模式
参数:无
返回:0     大端模式
      1     小端模式    地址    数据 【低地址 放 低位数,假设i = 0x12345678】
                        0000    78
                        0001    56
                        0002    34
                        0003    12
*****************************************************************************************/
int  MathCheckEndion(void)
{
    union check
    {
        int i;
        char ch;
    }c;
    c.i = 1;
    return (c.ch);
}
/*****************************************************************************************
功能:                               字符串转整型
输入:字符串可以是如下形式:
        [空格 | Tab] + [+ | -] + {数值字符}如: " 123" "-334998"
返回:超过最值时返回最值
      输入错误时返回0
******************************************************************************************/
#define M_INT_MAX 0x7FFFFFFF    //最值定义
#define M_INT_MIN 0x80000000
int MathAtoi(const char * str)
{
    char sign = 1;
    char tmp  = 0;
    unsigned int vaule = 0;
    if ( str == (void *)0)
    {   return 0;   }
    //去掉空格和Tab
    while (*str == ' ' || *str == '\t')
    {
        str++;
    }
    if(*str == '+' || *str == '-')
    {
        if (*str == '-')
        {
            sign -= 2;              //即sign=-1,防止报警
        }
        str++;
    }
    //进行转换
    while(('0'<= *str) && (*str <= '9'))
    {
        tmp = *str - '0';
        //若超出范围则取最值
        if ((M_INT_MAX /10 == vaule && tmp > M_INT_MAX %10) || (M_INT_MAX/10 <vaule))
        {
            return (sign > 0)?(M_INT_MAX):(M_INT_MIN);
        }
        vaule = vaule*10 + tmp;
        str++;
    }
    return vaule *sign;
}
/*****************************************************************************************
功能:                               整型转字符串
输入:数值 -2147 4836 47 < n < 2147 4836 47
返回:字符串 “-xxxx” 或 “xxx”  最长12位=符号+10位值+结束符
      注意:*str  要足够长,否则访问越界
******************************************************************************************/
char* MathItoa(int intvalue,char * str)
{
    char *pstr = str;
    char tmp[12];                   //暂存区
    unsigned char i = 0;            //计数器
    if(intvalue < 0)                //负数判断
    {
        *str++ = '-';
        intvalue = intvalue*(-1);
    }
    tmp[i++] = '\0';                //结束符
    do
    {
        tmp[i++] = intvalue%10 + '0';
        intvalue = intvalue/10;
    }while(intvalue!=0);
    do                              //反序存入
    {
        *str++ = tmp[--i];
    }while(i);
    return pstr;
}

/*****************************************************************************************
功能:                               字符串比较大小
输入:src dst          按照ASCII的值大小依次比较
返回:-1    src < dst
       0    src = dst
       1    src > dst
******************************************************************************************/
int MathStrCmp(const char *src ,const char *dst)
{
    int ret = *(unsigned char*)src - *(unsigned char*)dst;;
    while( (!ret) && *dst)          //赋值在括号内会产生告警
    {
        ret = *(unsigned char*)src - *(unsigned char*)dst;
        src++;
        dst++;
    }
    if(ret < 0)                     //src < dst
    {
        return -1;
    }else if(ret > 0)               //src > dst
    {
        return 1;
    }
    return 0;                       //src > dst
}

/*****************************************************************************************
功能:                               字符串长度计算
输入:src   指针
返回:字符串长度(不包括结束符)
******************************************************************************************/
unsigned int MathStrLen(const char *str)
{
    unsigned int len = 0;
    if(str == (const char *)0)
    {
        return 0;
    }
    while((*str++) != '\0')
    {
        len++;
    }
    return len;
}
/*****************************************************************************************
功能:                               字符串复制
输入:src dst  指针
返回:src      指针
******************************************************************************************/
char* MathStrCopy(char *src ,const char *dst)
{
    char * tmp = src;
    if(src==(char *)0 || dst==(char *)0)
    {
        return (char *)0;
    }
    while((*src++ = *dst++) != '\0');
    return tmp;
}
/*****************************************************************************************
功能:              在字符串中 找字串是否有出现字串
输入:源串,子串    都是字符串形式
输出:0:源串中没有子串
      1: 源串中  有子串
******************************************************************************************/
int MathStrIsHave(const char *src, const char *dst)
{
    const char *cdst;
    const char *csrc;
    //不能是空指针
    if(src==0 || dst==0)
    {
        return 0;
    }
    //不能查找空串
    if(*dst=='\0')
    {
        return 0;
    }
    //直到源串结束
    while(*src != '\0')
    {
        cdst = dst;
        csrc = src;
        while(*csrc++ == *cdst++)
        {
            //到子串结束时,认为找到了
            if (*cdst == '\0')
            {
                return 1;
            }
        }
        src++;
    }
    return 0;
}
/*****************************************************************************************
功能:              把ptr所指内存区域的前count个字节设置成字符c
输入:指针,C,长度
输出:指针
******************************************************************************************/
void *MathMemSet(void *ptr,char c,unsigned int len)
{
    void * start = ptr;
    if (ptr == 0)
    {
        return (void*)0;
    }
    while(len--)
    {
        *(char*)ptr = (char)c;
        ptr = (char*)ptr+1;
    }
    return start;
}
/*****************************************************************************************
功能:              内存复制
输入:目的指针,源指针,要复制的字节数
输出:目的指针
******************************************************************************************/
void *MathMemCopy(void *dest,void *src,unsigned int len)
{
    char *start = dest;
    if (dest==(void*)0 || src==(void*)0)
    {
        return (void*)0;
    }

   while(len--)
    {
        *(char *)dest = *(char*)src;
        dest = (char *)dest+1;
        src = (char *)src+1;
    }
    return start;
}
/*****************************************************************************************
功能:              内存移动
输入:目的指针,源指针,要复制的字节数
输出:目的指针
******************************************************************************************/
void *MathMemMove(void *dest,void *src,unsigned int len)
{
    char *start = dest;
    if (dest==(void*)0 || src==(void*)0)
    {
        return (void*)0;
    }

   if(dest < src || (char *)dest >= (char *)src + len )
    {
        while(len--)
        {
            *(char *)dest = *(char*)src;
            dest = (char *)dest+1;
            src = (char *)src+1;
        }
    }else
    {   //此处,解决内存重复的现象。与MathMemCopy的区别也是在此
        dest = (char *)dest+len -1;
        src = (char *)src+len -1;
        while(len--)
        {
            *(char *)dest = *(char*)src;
            dest = (char *)dest-1;
            src = (char *)src-1;
        }
    }
    return start;
}
/*****************************************************************************************
功能:              按字节求异或值
输入:目的指针,长度
输出:求得的值
******************************************************************************************/
char MathXor(char *xordata,u32 len)
{
    u32 i = 0;
    char xor = 0;
    while(len--)
    {
        xor = xor ^ xordata[i++];
    }
    return xor;
}

 

抱歉!评论已关闭.