CCITT标准的CRC16计算

#define POLY        0x1021  
/**
*CITT标准的CRC16计算
*addr:待计算数据的起始地址
*num:待计算数据长度(字节数)
*返回值:16位校验值
**/
uint16_t crc16(uint8_t *addr, uint32_t num)  
{  
    int i;  
    uint16_t crc = 0xFFFF;
    for (; num > 0; num--)
    {  
        crc = crc ^ (*addr++ << 8);
        for (i = 0; i < 8; i++) 
        {  
            if (crc & 0x8000)
                crc = (crc << 1) ^ POLY; 
            else                        
                crc <<= 1;
        }                 
        crc &= 0xFFFF; 
    } 
    return(crc);
}  

MODBUS RTU通信的 CRC16计算

#define POLY   0xa001;

/**
*根据ModBus规则计算CRC16
*addr:待计算数据的起始地址
*num:待计算数据长度(字节数)
*返回值:16位校验值
**/
uint16_t crc16(uint8_t *addr, uint32_t num)
{
    uint16_t crc = 0xFFFF
    for(;num > 0;num--)
    {
        crc = crc^(*addr++);
        for(int i = 0;i<8;i++)
        {
            if(crc & 0x0001)
                crc = (crc>>1)^POLY;
            else
                crc >>= 1;
        }
    }
    return(crc);
}

C语言开根号

这里实现的是32位无符号整数开方得到16位无符号整数的C语言代码

/**************************************** 
*
* Function: 开根号处理
* 入口参数:被开方数,长整型 
* 出口参数:开方结果,整型 
*
*****************************************/ 

unsigned int sqrt_16(unsigned long M)
{
	unsigned int N, i;
	unsigned long tmp, ttp; // 结果、循环计数

	if (M == 0) // 被开方数,开方结果也为0
		return 0;
	N = 0;
	tmp = (M >> 30); // 获取最高位:B[m-1]
	M <<= 2;
	if (tmp > 1) // 最高位为1
	{
		N ++;
		tmp -= N;
	}
	for (i=15; i>0; i--) // 求剩余的15位
	{
		N <<= 1;
		tmp <<= 2;
		tmp += (M >> 30); 
		ttp = N;
		ttp = (ttp<<1)+1;
		M <<= 2;
		if (tmp >= ttp)
		{
			tmp -= ttp;
			N ++;
		}
	}
	return N;
}