单片机c语言中的左移右移

发布者:pcwg最新更新时间:2015-11-02 来源: eefocus关键字:单片机  c语言中  左移右移 手机看文章 扫描二维码
随时随地手机看文章
单片机c语言中的左移右移

左移
变量1 << 变量2
将变量1的二进制位值向左移动由变量2所指定的位数。
例如:
a = 0x8f; // 10001111
a << 2; // 左端移出的值丢弃,右端补0
结果:a = 0x3c (00111100)

在keil c51中,内部函数库INTRINS.H中_crol_(m,n)表示将m循环左移n位,
与m<


右移
变量1 >> 变量2
将变量1的二进制位值向右移动由变量2所指定的位数。
例1:
unsigned char a;
a = 0x8f; // 10001111
a >> 2; // 右端移出的值丢弃,左端补0
结果:a = 0x23 (00100011)

例2:
char a;
a = 0x8f; // 10001111
a >> 2; // 右端移出的值丢弃,左端补入原来的符号位
 // 据说有些编译器采用逻辑右移,即左端补0
结果:a = 0xe3 (11100011)
 
1当左移移出的是“1”而不是0时,你该怎么想?
2 当左移的操作数是一个sign型是,你该怎么想?
3 在单片机中和在C语言中是完全一样的吗?
4 左移与右移在内存中的关系?
5 什么时候左移相当于乘2?
6 有兴趣的话可以研究一下单片机汇编中的循环左右移!
左移
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:
int i = 1;
i = i << 2; //把i里的值左移2位
也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)
需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:
int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000
i = i << 1;
那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.
左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:
int i = 1, j = 0x80000000; //设int为32位
i = i << 33; // 33 % 32 = 1 左移1位,i变成2
j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃
在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是332后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.
总之左移就是: 丢弃最高位,0补最低位
在keil c51中,内部函数库INTRINS.H中_crol_(m,n)表示将m循环左移n位,
与m< 再说右移,明白了左移的道理,那么右移就比较好理解了.
右移
右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.
右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:
int i = 0x80000000;
i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000
就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.
负数10100110 >>5(假设字长为8位),则得到的是 11111101
总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多
总结
1移位操作符的两个操作数必须是整型的。整个移位表达式的值的类型也是整型的,而且,左移位操作符与右移位操作符的运算并不对称。
2 一切以在内存中的存储形式有关!


关键字:单片机  c语言中  左移右移 引用地址:单片机c语言中的左移右移

上一篇:8位单片机,大数运算,可以运算任意位数的乘除法
下一篇:32位单片机分析

推荐阅读最新更新时间:2024-03-16 14:38

使用PIC单片机开发的被动红外传感器模块的报警器
  在本文中,单片机开发工程师们分享了一个使用PIC单片机开发的被动红外(PIR)传感器模块的报警器。在这个方案中,我们使用PIC12F635单片机进行开发,持续监控传感器模块的输出,并在其激活时打开蜂鸣器。   一、被动红外(PIR)报警器方案的原理   某些半导体材料具有暴露于热红外辐射时会产生表面电荷的特性。这种现象称为热电。被动红外(PIR)传感器模块的工作原理相同。人体以红外线辐射的形式辐射热量,最大约为9.4微米。人体的存在会导致热释电传感器感应到的周围环境的IR轮廓发生突然变化。PIR传感器模块在板上具有仪表电路,该仪表电路将该信号放大到适当的电压电平以指示运动的检测。   PIR传感器需要大约10到60秒的
[单片机]
使用PIC<font color='red'>单片机</font>开发的被动红外传感器模块的报警器
瑞萨全新入门级RA2E1 MCU问市
全球半导体解决方案供应商瑞萨电子集团宣布,推出48款全新RA2E1 MCU产品,以扩展其32位RA2 MCU产品群。入门级单芯片RA2E1 MCU基于48MHz Arm® Cortex®-M23内核,具有最高128KB的代码闪存和16KB的SRAM。 RA2E1 MCU产品群支持1.6V至5.5V的宽工作电压范围和多种封装,如LQFP、QFN、LGA、BGA及 晶圆级芯片封装 (WLCSP),提供卓越性能、超低功耗、创新外设和小型封装的优化组合。这些特点使RA2E1产品群成为在成本敏感及空间受限型应用中满足高性能、低功耗系统需求的理想选择。全新MCU提供具备软/硬件扩展的升级路径,是瑞萨RA产品家族强大阵容的理想入门级产品。
[嵌入式]
瑞萨全新入门级RA2E1 <font color='red'>MCU</font>问市
MSP430系列单片机-Timer_A实现PWM
概念 PWM信号是一种具有固定周期、不定占空比的数字信号。 如果Timer_A的计数器工作在增计数模式,输出采用输出模式7(复位/置位模式) 利用寄存器TAxCCR0控制PWM波形的周期,用其他某个寄存器TAxCCRx来控制占空比(t高电平/ T周期) 题目 设ACLK = TACLK = LFXT1 = 32768Hz, MCLK = SMCLK = DCOCLK = 32 * ACLK = 1.048576MHz,利用Timer_A输出周期 512/32768 = 15.625ms,占空比分别为75%和25%的PWM矩波形。 代码如下: #include msp430x44x.h void main()
[单片机]
MSP430系列<font color='red'>单片机</font>-Timer_A实现PWM
对话 TI Sitara MCU 总经理:使实时处理变得简单且实惠产品
对话 TI Sitara™︎ MCU 总经理 Mike Pienovi:使实时处理变得简单且实惠的产品 随着对电子系统边缘实时控制、智能和通信需求的不断增长,高性能 MCU 现在提供了一种简单且经济高效的解决方案。 从智能工厂到智能城市,我们日益自动化的世界要求电子产品具有更高的速度、智能和精度。例如,与人类协同工作的自动化移动机器人需要精确的电机控制来安全地在物体周围导航,并且需要更快的处理速度以进行纳秒级决策 – 这些协同工作的实现都需要相互之间的通信。 为电子系统添加高级边缘分析和高实时性响应即将变得更容易、更实惠。TI Sitara™ MCU 总经理 Mike Pienovi向我们介绍了智能联网系统需求下,影响
[嵌入式]
基于STM32F107VCT6微控制器的控制系统解决方案
本文简要介绍了电动汽车交流充电桩的内容和研究现状。针对需要设计了基于STM32F107VCT6微控制器的控制系统解决方案,并详细介绍了控制系统的软硬件设计和桩体的电气部分设计。该系统提供包括人机交互、充电控制、电能计量、IC卡付费、票据打印、运行状态监测、充电保护和充电信息存储和上传等多种完善的功能,满足充电过程的要求。 随着全球能源危机的不断加深,石油资源的日趋枯竭以及大气污染、全球气温上升的危害加剧,各国政府及汽车企业普遍认识到节能和减排是未来汽车技术发展的方向,发展电动汽车将是解决这两个难题的最佳途径。我国高度重视电动汽车的发展,国家相继出台了一系列标准来扶持和规范电动汽车的发展。但要实现电动汽车大面积普及我国还有很长的
[单片机]
基于STM32F107VCT6<font color='red'>微控制器</font>的控制系统解决方案
瑞萨推出新型微控制器 扩大28nm跨域汽车MCU产品阵容
据外媒报道,先进半导体解决方案的主要供应商瑞萨电子集团(Renesas Electronics Corporation)宣布推出一组功能强大的新型微控制器(MCU):RH850/U2B MCU,旨在满足日益增长的、将多种应用集成至单个芯片的需求,同时为不断发展的电气电子(E/E)实现统一的电子控制单元(ECU)。该跨域RH850/U2B MCU集高性能、灵活性、抗干扰性和安全性于一身,专为满足车辆运动所需的严苛工作负载而打造,适用于混合动力ICE和xEV牵引逆变器、高端区域控制、互联网关和域控制等应用。 (图片来源:瑞萨) 借此,瑞萨电子扩展了其跨域MCU产品阵容,涵盖用于车身和底盘控制系统的RH850/U2A MCU,
[汽车电子]
瑞萨推出新型<font color='red'>微控制器</font> 扩大28nm跨域汽车<font color='red'>MCU</font>产品阵容
基于单片机的LED汉字显示屏的设计与仿真
O 引言 LED显示屏是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。它具有发光率高、使用寿命长、组态灵活、色彩丰富以及对室内外环境适应能力强等优点。并广泛的用于公交汽车、商店、体育场馆、车站、学校、银行、高速公路等公共场所的信息发布和广告宣传。LED显示屏发展较快,本文讲述了基于AT89C51单片机16×16LED汉字点阵滚动显示的基本原理、硬件组成与设计、程序编写与调试、Proteus软件仿真等基本环节和相关技术。 1 硬件电路组成及工作原理 本产品采用以AT89C51单片机为核心芯片的电路来实现,主要由AT89C51芯片、时钟电路、复位电路、列扫描驱动电路(74HCl54)、16×16LED点阵5部分组成,如
[单片机]
基于<font color='red'>单片机</font>的LED汉字显示屏的设计与仿真
STM32的基本系统是怎样的?
电源 无论是否使用模拟部分和AD部分,MCU外围出去VCC和GND,VDDA、VSSA、Vref(如果封装有该引脚)都必需要连接,不可悬空 对于每组对应的VDD和GND都应至少放置一个104的陶瓷电容用于滤波,并接该电容应放置尽量靠近MCU 用万用表测试供电电压是否正确,调试时最好用数字电源供电,以便过压或过流烧坏板子,电压最好一步一步从进线端测试到芯片供电端 复位、启动选择 Boot引脚与JTAG无关。其仅是用于MCU启动后,判断执行代码的起始地址 在电路设计上可能Boot引脚不会使用,但要求一定要外部连接电阻到地或电源,切不可悬空;STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 用户闪存 = 芯片内置的Fla
[单片机]
STM32的基本系统是怎样的?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved