c语言算术运算符中循环移位和算术移位是怎么样的?怎么理解 ?

算术移位与逻辑移位的区别_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
算术移位与逻辑移位的区别
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。深入理解C语言中的移位运算_Linux编程_Linux公社-Linux系统门户网站
你好,游客
深入理解C语言中的移位运算
来源:Linux社区&
作者:Linux
说明:本文主要摘录自《深入理解计算机系统》第二章信息的表示与处理。
移位运算:
& & & & C语言还提供了一组移位运算,以便向左或者向右移动位模式。对于一个位表示为[xn-1,xn-2,&,x0]的操作数x,C表达式x&&k会生成一个值,其位表示为[xn-k-1,xn-k-2,&,x0,0,&,0]。也就是说,x向左移动k位,丢弃最高的k位,并在右端补k个0。移位量应该是一个0~n-1之间的值。移位运算是从左至右可结合的,所以x&&j&&k等价于(x&&j)&&k。
& & & & 有一个相应的右移运算x&&k,但是它的行为有点微妙。一般而言,机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移在左端补k个0,得到的结果是[0,&,0,xn-1,xn-2,&,xk]。算术右移是在左端补k个最高有效位的值,得到的结果是[xn-1,&,xn-1,xn-1,xn-2,&,xk]。这种做法看上去可能有点奇特,但是我们会发现它对有符号整数数据的运算非常有用。
& & & & 让我们来看一个例子,下面的表给出了对某些实例8位数据做不同的移位操作得到的结果。
[0011 0000]& & [0101 0000]
X&&4(逻辑右移)
[0000 0110]& & [0000 1001]
X&&4(算术右移)
[0000 0110]& & [1111 1001]
& & & & 斜体的数字表示的是最右端(左移)或最左端(右移)填充的值。可以看到除了一个条目之外,其他的都涉及填充0。唯一的例外是算术右移[]的情况。因为操作数的最高位是1,填充的值就是1。
& & & & C语言标准并没有明确定义应该使用哪种类型的右移。对于无符号数据(也就是以限定词unsigned声明的整型对象),右移必须是逻辑的。而对于有符号数据(默认的声明的整型对象),算术的或者逻辑的右移都可以。不幸的是,这就意味着任何假设一种或者另一种右移形式的代码都潜在着可移植性问题。然而,实际上,几乎所有的编译器/机器组合都对有符号数据使用算术右移,且许多程序员也都假设机器会使用这种右移。
另一方面,Java对于如何进行右移有明确的定义。表达式x&&k会将x算术右移k个位置,而x&&&k会对x做逻辑右移。
当移动k位,这里k很大时
& & & & 对于一个由w位组成的数据类型,如果要移动k&w位会得到什么结果呢?例如,在一个32位机器上计算下面的表达式会得到什么结果:
Int & & & lval = 0xFEDCBA98& && 32;
int & & & lval = 0xFEDCBA98& && 36
unsigned &lval = 0xFEDCBA98u& && 40;
& & & & C语言标准很小心地规避了说明在这种情况下该如何做。在许多机器上,当移动一个w位的值时,移位指令只考虑位移量的低log2w位,因此实际上位移量就是通过计算k mod w得到的。例如,在一台采用这个规则的32位机器上,上面三个移位运算分别是移动0、4和8位,得到结果:
Lval & &0xFEDCBA98
Aval & &0xFEDCBA9
Uval & &0x00FEDCBA
& & & & 不过这种行为对于C程序来说是没有保证的,所以移位数量应该保持小于字长。另一方面,Java特别要求位移数量应该按照我们前面所讲的求模的方法来计算。
与移位运算有关的操作符优先级问题
& & & & 常常有人会写这样的表达式1&&2+3&&4,其本意是(1&&2)+(3&&4)。但是在C语言中,前面的表达式等价于1&&(2+3)&&4,这是由于加法(和减法)的优先级比移位运算要高。然后,按照从左至右结合性规则,括号应该是这样打的(1&&(2+3))&&4,因此得到的结果是512,而不是期望的52。在C表达式中搞错优先级是一种常见的程序错误,而且常常很难检查出来。所以当你拿不准的时候,请加上括号!
C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
读C++ Primer 之构造函数陷阱
读C++ Primer 之智能指针
读C++ Primer 之句柄类
将C语言梳理一下,分布在以下10个章节中:
Linux-C成长之路(一):Linux下C编程概要
Linux-C成长之路(二):基本数据类型
Linux-C成长之路(三):基本IO函数操作
Linux-C成长之路(四):运算符
Linux-C成长之路(五):控制流
Linux-C成长之路(六):函数要义
Linux-C成长之路(七):数组与指针
Linux-C成长之路(八):存储类,动态内存
Linux-C成长之路(九):复合数据类型
Linux-C成长之路(十):其他高级议题
本文永久更新链接地址:
相关资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款循环移位,最全面的循环移位文章 - 电子工程世界网
在电子工程世界为您找到如下关于“循环移位”的新闻
循环移位资料下载
循环移位置换单元是准循环LDPC 码的部分并行译码器的重要组成部分。该文研究并证明了ReverseBanyan 交换结构在实现信息循环移位时各个基本交换单元的连接规律。基于该规律设计了基于可预置选路算法的无阻塞循环移位置换结构。相比Benes 交换结构和Reverse Banyan 交换结构,提高了信息循环移位交换的速率,且占用较少的硬件资源和面积。最后设计了一个...
移位运算器SHIFTER 使用Verilog HDL 语言编写,其输入输出端分别与键盘/显示器LED 连接。移位运算器是时序电路,在J钟信号到来时状态产生变化, CLK 为其时钟脉冲。由S0、S1 、M 控制移位运算的功能状态,具有数据装入、数据保持、循环右移、带进位循环右移,循环左移、带进位循环左移等功能。CLK 是时钟脉冲输入,通过键5 产生高低电平M 控制工作模式, M=l 时带进位循环...
不同周期所得离散付利叶曲线ex050800& 高密度和高分辨频谱的差别ex050900& 循环折叠特性的检验ex051000& 循环奇偶分解特性(5.34)的检验ex051100& 循环移位特性的检验ex051200& 循环移位特性的检验ex051300& 循环卷积的计算ex051400& 循环卷积的计算ex051500&nbsp...
中的核心技术之一。 当今LDPC码构造的主流方向有两个,分别是结合准循环(QC,Quasi Cyclic)移位结构的单次扩展构造和类似重复累积(RA,Repeat Accumulate)码构造。相应地,主要的LDPC码编码算法有基于生成矩阵的算法和基于迭代译码的算法。基于生成矩阵的编码算法吞吐量高,但是需要较多的寄存器和ROM资源;基于迭代译码的编码算法实现简单,但是吞吐量不高,且不容易构造高性能...
【星嵌电子-实验95】循环移位与非循环移位比较.rar...
,然后再经ALU完成算逻运算操作。移位包括:算术右移、逻辑左移、逻辑右移、循环左移以及循环右移。所以,μ’nSP™的指令系统里专有一组复合式的‘移位算逻操作’指令;此一条指令完成移位和算术逻辑操作两项功能。程序设计者可利用这些复合式的指令,撰写更精简的程序代码,进而增加程序代码密集度 (Code Density)。在微控制器应用中,如何增加程序代码密集度是非常重要的议题;提高程序代码密集...
整数就说明是可以的!A:8 位数(0-255)循环左移或循环右移偶数位得到的,F0000001 既是0x1F 循环右移4 位,符合规范,所以是正确的.这样做是因为指令长度的限制,不可能把32 位立即数放在32 位的指令中.移位偶数也是这个原因.可以看一看ARM 体系结构(ADS 自带的英文文档)的相关部分.第3 问:Q:请教:《ARM 微控制器基础与实战》2.2.1 节关于第2 个操作数的描述中有...
—255 之间的数左移或右移偶数位的来的,也就是这个数除以4一直除, 直到在0-255的范围内它是整数就说明是可以的!A:8位数(0-255)循环左移或循环右移偶数位得到的,F0000001既是0x1F循环右移4位,符合规范,所以是正确的.这样做是因为指令长度的限制,不可能把32位立即数放在32位的指令中.移位偶数也是这个原因.可以看一看ARM体系结构(ADS自带的英文文档)的相关部分.第3问:Q...
这个数除以4一直除, 直到在0-255 的范围内它是整数就说明是可以的!A:8 位数(0-255)循环左移或循环右移偶数位得到的,F0000001 既是0x1F 循环右移4位,符合规范,所以是正确的.这样做是因为指令长度的限制,不可能把32 位立即数放在32 位的指令中.移位偶数也是这个原因.可以看一看ARM 体系结构(ADS 自带的英文文档)的相关部分.第3 问:Q:请教:《ARM 微控制器基础...
操作指令.2.4.3 数据转换指令.2.4.4 数据移动指令.2.4.5 程序分支指令.2.4.6 程序执行控制指令.2.4.7 I/O刷新指令2.4.8 其它易于使用的指令.2.5 应用指令.2.5.1 逻辑操作指令.2.5.2 循环指令.2.5.3 移位指令.2.5.4 位处理指令.2.5.5 数据处理指令.2.5.6 结构体创建指令.2.5.7 数据表操作指令.2.5.8 缓冲区访问指令...
循环移位相关帖子
二、二进制转BCD
本文由杭电网友曾凯峰贡献,特此感谢
我们的数据在运算或者存储的时候,一般都是以二进制的格式存在的。但是在很多情况下,我们需要将运算结果显示到某种显示设备上,如果直接以二进制的形式来显示的话,会非常不便于我们查看。因此,我们需要首先将二进制数转换为十进制数再进行显示。二进制到十进制的转换有很多种方法。这里,我们和大家一起学习一种国外目前最为流行的转换方法—逐步移位法...
。 当然,如果你想让你的显示变得动态有型,你可以用移位命令(带循环移位)、闪烁功能以及消隐功能来帮你装饰这些小小的想法。你想要的,ZLG都为你想到了。 & && & ZLG72128可以管理32(8x4)个按键,内部自带消抖。其中有一行8个按键可以作为功能键与其他的普通健进行复用,这样按键组合就变成无限多的可能。如果说你用不了这么多,硬件设计上可以按照行列进行...
获得的参数可以用来区别处理器的不同指令并估计总线上同时翻转的位数。
  通过平均多次重复同样操作的电流,即使是没有通过总线的很小信号也能区别开。有些信号如移位状态特别有用,因为很多密码的密钥产生算法使用移位操作来逐一移出单个密钥倒进位标志。即使状态位的变化不能直接测量,它们通常会改变指令次序或微码的执行,这会导致功耗的明显变化。
  不同指令导致不同级别的指令解码和运算单元的活动,可被清晰...
& & & & & & & && & clk_1k
& & & & & & & &
//循环移位的寄存器
& & & & & &nbsp...
却是 2:1,后来猜测,这可能和每次都执行了一个 移位 和 一个 位或操作有关。
看来,和这个相比,取数组的偏移计算,在底层反而是微不足道的。
后来,改成32位后,时间差别还是 为 3:2.
所以结论是:
使用位的方式,节省存储器,数据和程序 存储空间 都节省。
但是时间上,却要慢一半到一倍。
这种时候,到底是牺牲时间换取空间 还是相反 完全取决于你。
毕竟在大多数...
TxBitCnt - 1的值,存放在R7中)放到R0中MOV R0,0x07;才会进入循环移位的代码部分,但是这条指令系统却是使用寄存器组0中的R7,而不是存储真正位数和寄存器组2中的R7,导致移位结果全为0。这个错误是和上一条错误是一样的。
5、我去掉定时器0中断使用寄存器组2的设置(using 2),系统就会使用默认的寄存器组0,只是进入中断函数前,会先把R0到R7的值压入堆栈,会多一些...
3.5.7 移位函数 70
3.5.8 拼接 70
3.6 判断与循环 71
3.6.1 if-then-else语句 71
3.6.2 case语句 72
3.6.3 for语句 72
3.6.4 while循环 72
3.6.5 exit语句 73
3.6.6 next语句 73
3.7 层次化设计 73
3.7.1 函数 73
3.7.2 包 73
分析它的main函数,定能找到关键线索。Main函数如下:由此可以看出,main函数开始执行的时候,首先要经过一个叫做initial_lcd的函数,然后进入循环主体,每隔一段时间打印一幅图像。那么接下来,就让我们细细品读这个initial_lcd函数的构成。代码如下:此可以看出,所谓LCD初始化就是首先拉低硬件复位信号12864_res一段时间再放开,等待复位结束以后,开始执行一条条指令:1. 软件...
电流值之间来回切换(数字调光)。利用脉冲宽度调变(PWM)来设定循环和工作周期可能是实现数字调光的最简单的方法,原因是相同的技术可以用来控制大部分的开关转换器。
PWM调光能调配准确色光
一般来说,模拟调光比较容易实行,这是因为LED驱动器的输出电流变化与控制电压成比例,而且模拟调光也不会引发额外的电磁兼容性(EMC)/电磁干扰(EMI)潜在频率问题。然而,大部分设计采用PWM调光的理由都是基于...
转自&&/article/cpu-programmer-know.html
有人在Twitter上谈到了自己对CPU的认识:
我记忆中的CPU模型还停留在上世纪80年代:一个能做算术、逻辑、移位和位操作,可以加载,并把信息存储在记忆体中的盒子。我隐约意识到了各种新发展,例如矢量指令(SIMD),新CPU还拥有了虚拟化支持...
循环移位视频
循环移位创意
你可能感兴趣的标签
热门资源推荐

我要回帖

更多关于 c语言算术运算符 的文章

 

随机推荐