找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5337|回复: 6
收起左侧

关于<<左移符号,有个搞不懂的地方,请大家指点一下,谢谢!

[复制链接]
ID:404479 发表于 2018-10-27 12:31 来自手机 | 显示全部楼层 |阅读模式
void main ()
{
      P2=(0xfe<<1);
}
首先,0xfe化成二进制1111 1110,于是左移一位=11111101,那么,就应该是P2.1口的发光二极管亮啊,为什么左移了一位,实验结果会是P2.0口和P2.1口的发光二极管都同时点亮,搞不懂请大家指点迷津,谢谢!
回复

使用道具 举报

ID:213173 发表于 2018-10-28 08:16 | 显示全部楼层
0xfe化成二进制1111 1110,于是左移一位=11111100,最高位溢出,最低位补0。使用循环左移一位才能把最高位补到最低位。P2=_crol_(P2,1);
回复

使用道具 举报

ID:416564 发表于 2018-10-28 10:43 | 显示全部楼层
可能是默认用0补上吧
回复

使用道具 举报

ID:395560 发表于 2018-10-28 10:50 | 显示全部楼层
0xfe化成二进制1111 1110,左移一位=11111100;
回复

使用道具 举报

ID:416611 发表于 2018-10-28 10:50 | 显示全部楼层
左移后不应该右边置零吗
回复

使用道具 举报

ID:415459 发表于 2018-10-28 16:26 | 显示全部楼层
移位分为逻辑左移,逻辑右移以及算数右移。
1、逻辑左移
左移n位,低n位补0,视数据类型的长度截断移位之后的数据。如题主所描述的,0xfe为一个字节,用二进制表示为0b1111 1110,也就是8个比特,左移一位之后,最低位补0,数据长度为9个比特,用二进制表示为0b1 1111 1100,由于一个字节只能存储八个比特,最高位溢出,最终移位的结果为0b1111 1100。
不同于右移,左移只有逻辑移位,没有算数移位。
2、逻辑右移
数据右移,处于高位的比特会空出来,为保证数据长度一致,这就涉及到对空出来的比特位填充的问题。当始终填充0时,不考虑原始数据的最高位比特,该右移被称为逻辑右移。
例如,0b1111 1110 ->逻辑右移1位->0b0111 1111
3、算数右移
和逻辑右移填充0不同,当原始数据的最高位为1时,填充位为1,当原始数据的最高位为0时,填充位为0,也就是填充位等于原始数据的最高位。
例如,0b1111 1110 ->算数右移->0b1111 1111

回复

使用道具 举报

ID:164602 发表于 2018-10-29 09:18 | 显示全部楼层
如果你是想只亮P21,那么,就必须是循环移位。
第一:加上头文件:intrins.h
第二:使用这个头文件中的循环移位函数:_crol_()向左(高位)移位和_cror_()向右(低位)移位函数。
这样,就不会是<<或>>命令中用零填空了,而是以你已经有的数据进行循环移位。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表