回6楼 hotpower 的话:

进位位还是很有用的,下面举一CRC校验程序的例子,两者运算时间相差甚远。

unsigned int DataCheck_CRC_2Bit(unsigned char *first_data_address,

// 校验的首个数据地址指针

unsigned int data_length)

// 校验的数据序列长度[注:包括CRC码长度]

{

register unsigned char i ;                    // 临时寄存器变量

register unsigned int j ;                     // 临时寄存器变量

register unsigned char checkdata ;            // 校验数据序列中的数据变量

register unsigned char check_crc_h ;          // 余式R(X)(CRC校验字节)的高字节

register unsigned char check_crc_l ;          // 余式R(X)(CRC校验字节)的低字节

volatile unsigned int datacheck_crc = 0 ;     // 余式R(X)(返回的CRC校验字节)

check_crc_h = *first_data_address++ ;         // 笫1个数据赋值于余式R(X)的高字节

check_crc_l = *first_data_address++ ;         // 笫2个数据赋值于余式R(X)的低字节

j = data_length ;                             // 赋值临时寄存器变量为校验数据序列长度

j = j - 2 ;                                   // 校验数据序列长度减去2位CRC码长度

while (j-- != 0)

{

checkdata = *(first_data_address++) ;       // 取下一个校验数据序列中的数据

for (i=0; i

{

if ((check_crc_h & BIT_HIGH) == BIT_HIGH) // 判断余式R(X)的高字节的高位是否为1?

{

check_crc_h = check_crc_h << 1 ;        // 余式R(X)的高字节左移1位

// 将余式R(X)的低字节的高位(位7)移进余式R(X)的高字节低位(位0)

if((check_crc_l & BIT_HIGH) == BIT_HIGH)// 判断余式R(X)的低字节的高位是否为1?

{

check_crc_h |= BIT_LOW ;              // 余式R(X)的高字节低位由0变1

}

check_crc_l = check_crc_l << 1 ;        // 余式R(X)的低字节左移1位

// 将校验数据的高位的高位(位7)移进余式R(X)的低字节低位(位0)

if((checkdata & BIT_HIGH) == BIT_HIGH)  // 判断校验数据的高位是否为1?

{

check_crc_l |= BIT_LOW ;              // 余式R(X)的低字节低位由0变1

}

checkdata = checkdata << 1 ;            // 校验数据左移1位

check_crc_h ^= CRC_NUM_H ;              // 余式R(X)高字节与除数多项式高字节异或

check_crc_l ^= CRC_NUM_L ;              // 余式R(X)低字节与除数多项式低字节异或

}

// 如果判断余式R(X)的高字节的高位不为1,那么只进行移位而不做与除数多项式异或

else

{

check_crc_h = check_crc_h << 1 ;        // 余式R(X)的高字节左移1位

// 将余式R(X)的低字节的高位(位7)移进余式R(X)的高字节低位(位0)

if((check_crc_l & BIT_HIGH) == BIT_HIGH)// 判断余式R(X)的低字节的高位是否为1?

{

check_crc_h |= BIT_LOW ;              // 余式R(X)的高字节低位由0变1

}

check_crc_l = check_crc_l << 1 ;        // 余式R(X)的低字节左移1位

// 将校验数据的高位的高位(位7)移进余式R(X)的低字节低位(位0)

if((checkdata & BIT_HIGH) == BIT_HIGH)  // 判断校验数据的高位是否为1?

{

check_crc_l |= BIT_LOW ;              // 余式R(X)的低字节低位由0变1

}

checkdata = checkdata << 1 ;            // 校验数据左移1位

}

}

}

// 按照高字节在前、低字节在后的排列顺序,放置产生的2位监督码(CRC码)

// 在数据序列的最后两个位置。

*--first_data_address = check_crc_l ;

*--first_data_address = check_crc_h ;

// 将两个单字节的监督码(CRC码)合并为一个字的监督码(CRC码)。

datacheck_crc = check_crc_h ;

datacheck_crc = datacheck_crc << SYSDATA_BITNUM ;

datacheck_crc = datacheck_crc + check_crc_l ;

return (datacheck_crc);                       // 返回一个字的监督码(CRC码)

}

#pragma warn-                       // 禁止编译时产生 warning(警告)信息

Uint16 DataCheck_CRC_2Bit(const unsigned int data_length,

// 校验的数据序列长度[注:包括CRC码长度]

unsigned char *first_data_address)

// 校验的首个数据地址指针

{

#asm

DataCheck_CRC2B:

push r16                        ;压入寄存器中的数值到堆栈

push r17

push r18

push r19

push r24

push r25

push r26

push r27

clr r24                         ;清除余式R(X)(校验字节)的寄存器

clr r25

ldi r19,0x10                    ;                 16   12   5

ldi r18,0x21                    ;除数多项式P(X)=X  +X  +X +1=$11021

ldd r30,Y+0                     ; R30 = 入口参数 *first_data_address 的低字节

ldd r31,Y+1                     ; R31 = 入口参数 *first_data_address 的高字节

ldd r26,Y+2                     ; R26 = 入口参数 data_length 的低字节

ldd r27,Y+3                     ; R27 = 入口参数 data_length 的高字节

DataCheck_CRC2B1:

ldi r17,0x08                    ; 8 位/每字节

ld r16,Z+                       ;取 Z 指针指向的 SRAM 中数据

DataCheck_CRC2B2:

lsl r16

rol r25

rol r24

brcc DataCheck_CRC2B3           ;当移出位为 1 时,

eor r24,r19                     ;将寄存器 r24:r25 中的内容

eor r25,r18                     ;与立即数 $1021 异或

DataCheck_CRC2B3:

dec r17                         ;位数-1

brne DataCheck_CRC2B2

sbiw r26,1                      ;数据长度-1

brne DataCheck_CRC2B1

st -Z,r25

st -Z,r24

mov r30,r25                     ;返回函数值

mov r31,r24

pop r27                         ;弹出堆栈中的数值到寄存器

pop r26

pop r25

pop r24

pop r19

pop r18

pop r17

pop r16

#endasm

}

#pragma warn+                       // 允许编译时产生 warning(警告)信息

c语言进位程序,c语言中如何做带进位位移相关推荐

  1. C语言之程序在内存中的分布以及内存越界问题

    C语言程序在内存中的分布: bss段:该段用来存放没有被初始化或者初始化为0的全局变量,以及被static修饰的未初始化的局部变量.在程序运行的整个生命周期内都存在于内存中.这个段中的变量只占用程序运 ...

  2. 常用c语言小程序,c语言经典小程序汇总大全

    网上有很多的人说编程有多么多么无聊,其实:不要管别人怎么说,别人说什么,做你自己喜欢做的事就好.坚持下来,你会发现编程的乐趣的.当然,如果你觉得学习编程语言很痛苦,坚持了一段时间后无果,南无果断放弃未 ...

  3. c语言小程序作业,c语言小程序(c语言简单小程序代码)

    所以特此求经典C语言小程序.谢谢大家的关注!!! #include #include void function(int n){ int i,j,k,x=0; for(i=1;i<=n;i++) ...

  4. c语言名字程序,c语言获得程序位数和操作系统位数和名称

    // vcis64.cpp : VC 64位程序开发心的--c语言获得程序位数和操作系统位数和名称. #include #include #include #include // 获取程序位数(被编译 ...

  5. c语言实验程序,C语言实验程序

    <C语言实验程序>由会员分享,可在线阅读,更多相关<C语言实验程序(11页珍藏版)>请在人人文库网上搜索. 1.P113:6 #include void main() floa ...

  6. c语言编号程序,c语言中如何在一个程序语句前加编号c语言中如何在一个程序语句前加...

    多数情况下,现在的编程高手都是从学习C 语言入门的,在学校里,计算机相关专业中最基础的课程也包括C 语言,因此,掌握好这门课程对每一位立志成为优秀程序员的初学者来说是大有裨益的!另外,对想通过参加全国 ...

  7. 编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法

    Modbus通信协议中CRC校验的快速C语言算法 2004年第11期 福 建 电 脑 63 Modbus通信协议中CRC校验的快速C语言算法 孟开元 (西安石油大学计算机学院陕西西安710065) [ ...

  8. c语言组成整数的最大数字,c语言 编写程序将一个正整数中的所有偶数数字取出来并用这些数字构成一个最大数。...

    满意答案 litielige 2016.11.20 采纳率:48%    等级:7 已帮助:515人 #include long fun(long s) { int sum = 0; long fin ...

  9. 利用C语言编写程序计算数字测图中的三角高程实验

    先说缺陷:1.一测回的度分秒值需要先用计算器换算为度值才能进行运算: 2.使用的文件较多: 3.因为老师要求用公式将斜距转换为直线距离,所以计算步骤略多: 4.个别英文单词拼写有误: 5.没有储存单向 ...

最新文章

  1. JConsole的使用
  2. AJAX Control Toolkit 30930
  3. iOS单例创建的一点疑惑
  4. 贝叶斯推断及其互联网应用(一)
  5. c语言soket编程,C语言socket编程使用方法
  6. oracle10g 创建分区表,oracle10G分区的创建与维护Oracle分区表和本地索引
  7. 腾讯敏捷研发协作平台TAPD荣获CCF科学技术奖
  8. mysql之多列索引
  9. JavaScript 函数循环、延时、节流、防抖
  10. oracle 安装乱码,linux安装Oracle中文乱码问题汇总
  11. Stack View的与众不同
  12. 百年通信史:落后西方半世纪的中国,用20年绝地反杀!
  13. e900v21e 装第三方_创维e900v21e刷机包
  14. 扫描件如何转换成pdf及word文档?
  15. 白杨SEO:百度算法更新大全合集49条(截至2021年9月),做百度关键词搜索排名必看!
  16. 国外的码农是什么状态?硅谷程序员:不加班,不穿女装
  17. 网络安全----密码学
  18. mac 硬盘未正常推出解决办法
  19. 23 PPT图表链接和动画
  20. Word转PPT如何转换?解锁转换新姿势

热门文章

  1. Python设计模式-单例模式
  2. 学习抖音上如何一下删除大型文件,源代码给出!
  3. Java环境及Eclipse(MyEclipse)安装
  4. PyTorch图像分类从模型自定义到测试
  5. 一文看懂神经网络初始化!
  6. Task01——零基础入门NLP - 新闻文本分类之赛题理解
  7. MySQL进阶SQL优化
  8. 深入浅出 Redis client/server交互流程
  9. 分布式数据库灵活存储机制与应用实践
  10. metaq的简单封装dataChange解读