单片机编程C51中的一个小问题

来源:百度知道 编辑:UC知道 时间:2024/05/31 05:45:35
比如说有一个数ACC=0x89,转化成二进制数就是1000 1001,请问ACC<<1的运算结果是多少?请好心人算一下。
DIN=(bit)(address&0x80); 为什么说这是取最高位?不明白。

解:发现一楼解答有误,特此更正。
一、比如说有一个数ACC=0x89,转化成二进制数就是1000 1001,请问ACC<<1的运算结果是多少?在C语言里没有含标志位移位的语句,ACC<<1的结果只能是0x12,不可能是0x13(右边自动补零)。

用以下办法可以实现带标志位移位:
CY=ACC&1;
...
CY=ACC&0x80;

这两个语句编译后会产生带进位右移和左移指令。

若要实现循环移位,可用以下办法:
1.先增加intrins.h头文件,执行以下函数:
循环左移:_crol_(unsigned char val,unsigned char n)
循环右移:_cror_(unsigned char val,unsigned char n),
返回无符号字符型值。
2.a=a<<1|((a&0x80)?1:0);循环左移多位做个循环
a=a>>1|((a&0x01)?1:0);循环右移多位做个循环

二。DIN=(bit)(address&0x80); 为什么说这是取最高位?
一楼所述正确。
address&0x80的意思是将address与0x80相“与”,显然最高位由address的最高位决定,而其它位均为0.
(bit)的意思是进行强制类型转换,变成位变量。

acc<<1因该是循环左移,包括:循环中不含标志位C的左移或右移和循环中包含C的左移或右移操作。
不包含:那就是0001,0011即0x13
包含:那首先要知道进位标志C是几:
如果是1:0001,0011即0x13
如果是0:0001,0010即0x12

取最高位问题:
一个8bit的二进制数与上1000,0000(你想任何数&0就是0,&1是原来那个数本身)所以就是取原来那个数的最高