A. 单片机中整数循环左移_irol,整数循环右移_iror。这个整数怎么移位的呢 位移位我懂。
_crol_ 字符循环左移
_cror_ 字符循环右移
_irol_ 整数循环左移
_iror_ 整数循环右移
_lrol_ 长整数循环左移
_lror_ 长整数循环右移
你的这个结果是错的
a = 0xA5A5;
b = _irol_(a,1) ; 执行后 b=0x4b4b;
按照你的结果应给是这样:
a = 0xA5A5;
b = _iror_(a,1) ; 执行后 b=0xd2d2;
PS: _iror_(a,1) 表示把变量a 循环右移1位
B. 单片机循环右移,用c怎么表示
那里用楼上两位那样罗嗦。
#include <intrins.h>
加入上述的头文件,不光解决了循环右移,还有循环左移的函数,8位、16位的都有。
C. 单片机 RRC右移 指令的用法
RRC指令就是带进位累加器循环右移。举例说明:
C =1,A=1100 1100B,
执行RRC A后,C=0,A=1110 0110B(A的最低位移给C,并且C原来的值移给A的最高位。)
SETB C(cy=1)
XCH A,R2(两数交换R2=54H,A=C2H)
JB A.7 , ELSE(若A的最高位为1,则转至else)
CLR C
ELSE: RRC A(带进位位右移A=1110 0 001B=E1H Cy=0)
XCH A ,R2(两数交换后,R2=E1H,A=54H)
RRC A(带进位位右移A=0010 1 010B=2AH Cy=0)
所以,最终(R2)=E1H,(A)=2AH
(3)单片机循环右移符号扩展阅读:
控制转移类指令还包括以下:
1、无条件转移指令 AJMP addrll (2字节指令),2K(地址211)字节范围内的无条件跳转指令。64K程序存储器空间分为32个区,每区2K字节,转移的目标地址必须与AJMP下一条指令的地址高5位地址码A15-A11相同。
指令执行时,先PC加2,然后把addrll送入PC.10~PC.0,PC.15~PC.11保持不变,程序转移到目标地址。注意:转移目标首地址必须在AJMP指令下一条指令地址(PC+2)的2KB范围内。
2、长跳转指令 LJMP addr16 (3字节指令),64K字节范围内的无条件跳转指令。指令执行时,把指令的第二和第三字节分别装入PC的高位和低位字节中,无条件地转向addr16指出的目标地址。
目标地址可以在64K程序存储器地址空间的任何位置。注意:短跳转、长跳转指令中addrll、addr16直接写上要转向的目标地址标号(即符号地址)就可以。
3、相对转移指令 SJMP rel (双字节),rel为8位带符号二进制补码数(-128~+127),实现程序的双向转移。在编写程序时,直接写上要转向的目标地址标号就可以。
4、间接跳转(散转)指令JMP @A+DPTR (三字节),由A中8位无符号数与DPTR的16位数内容之和来确定。以DPTR内容作为基址,A的内容作变址。
5、条件转移指令 (双字节)
JZ rel ; 如果累加器为“0”,则转移
JNZ rel; 如果累加器非“0”,则转移
D. 请问C51单片机的循环左移和循环右移函数中的“循环”是指什么
C51单片机的循环左移函数是,_crol_(变量名,n),循环右移函数是,_cror_(变量名,n),函数中的“循环”是指变量的8位二进制数依次向左移一位,或向右移一位。
你比如的,取8位数,让1111 1110循环左移一位,就是在1111 1110、1111 1101、1111 1011、1111 0111、1110 1111,等等,每移位一次,8位数向左或向右移一位。继续移位,就会循环重复的。
E. 51单片机执行循环右移指令的问题
我是这样想的,每个单元右移8位,然后四个单元右移,就是33H-30H,32H-33H,31H-32H,30H-31H,再左移8位,再单元左移,重复4次。
F. 想知道单片机》《移位符号的用法。想要实例就这个程序希望大家给一些解释。
如果将该数值左移1位,就变成了 0b10101010(最右边这个0是移空了以后补的),这个数值是0xaa
从数学上看,左移1位等于乘以2,右移1位等于除以2,然后再取整,移位溢出的丢弃。
例如:
unsigned char a;
a=1; //0b00000001
a<<=1; //0b00000010 a左移1位等效于a=a*2
a<<=2; //0b00001000 a左移2位等效于a=a*2的2次方(4)
a<<=3; //0b01000000 a左移1位等效于a=a*2的3次方(8)
a<<=1; //0b10000010 a左移1位等效于a=a*2
a<<=1; //0b00000000 a再次左移1位后溢出了,结果变成0了
c=a<<b; 在变量都是8位的时候,等效于 c=(a*pow(2,b))%256
G. 单片机 移位操作 右移 C语言
先说第一个问题:
比如用查表法将结果保存到变量i中,查表变量为x,则i=table[x],记住c语言里面数组是从0开始的,比如说上面的0x01就是table[0],0x02是table[1],以此类推。
再说第二个问题:
比如说从p1.0口发送出去,则可以写为
sbitout=p1^0;//定义out为p1.0口,这样今后好写程序
chari;
for(i=0;i<8;i++)
{
out=data&0x80;//因为高位在前,将它写成二进制就明白了
data<<=1;
}
上面的程序就能搞定了;
应该是所有的单片机都有cy位(不知道浮点dsp有没有);
c语言中左移和右移之后低位或高位自动补零,cy位也保持为零(视编译器而定,这个得看编译器手册),有些编译器提供了循环移位的函数;
还有什么不明白的补充问题就是
H. 哪位帅哥帮我解答下单片机中左移,右移的含义
左移 右移都是位运算
a<<=1相当于a=a<<1
a>>=1相当于a=a>>1
左移一位相当于所有二进制依次左移一位 最低位补0 最高位抹去
比如3<<1 二进制11左移后为110=6
对于无符号数 右移一位类似左移 最低位抹去 最高位补0
如3>>1 为 1
对于有符号数右移 当为正(最高位为0) 同无符号数右移相同
当为负 (最高位为1) 右移时最低位抹去 最高位补1
如
0x89二进制10001001 右移一位为11000100(二进制)
I. 单片机 移位操作 右移 C语言
C51系列单片机中_crol_指令是循环左移函数,_cror_是循环右移函数,这是51中特有的指令,别的类型单片机就不能使用了。易于程序的移植和通用性考虑个人比较推荐用<< 左移, 右移>>这两个C中的移位符号。