[MCU] 多字节移位

[复制链接]
1307|19
 楼主| jiajs 发表于 2020-6-26 17:03 | 显示全部楼层 |阅读模式

前辈们,指点一下哟。    原来用汇编编程很容易的就进行多字节的移位,现在刚开始学用Keil  C编程,就搞不懂从哪下手:

    就是比如一次性移位11个字节,比如左移,将最高字节的最高位移出丢失,并将下一字节的最高位移进前一字节的最低位,如此进行将后10个字节的最高位分别移进其前一字节的最低位,最后一个字节的最低位补0(或补1)。右移反过来。
 楼主| jiajs 发表于 2020-6-26 17:06 | 显示全部楼层
汇编的时候有RRL,RRC就搞定了,C怎么弄啊?
zhenykun 发表于 2020-6-26 19:08 | 显示全部楼层
不懂,帮顶一个
wyjie 发表于 2020-6-26 19:14 | 显示全部楼层
后10个字节的最高位分别移进其前一字节的最低位?我怎么没明白
yszong 发表于 2020-6-26 19:18 | 显示全部楼层
比如有这些字节要参与移位:unsigned char  a[]={0xfe,0x25,0x32,0x56,0x4e,0x56,0xab,0xef,0xf3}:

   a[i]=a[i]<<1|((a[i+1]&0x80)? 1:0);      //    i 由0到7 。

   a[8]=a[8]<<1;

   这样子就可以同时将9个字节顺次向前移一位,如果要连续移多位,再加个循环控制就行了。
lizye 发表于 2020-6-26 19:23 | 显示全部楼层
5楼的好办法@
shimx 发表于 2020-6-26 19:26 | 显示全部楼层
这是 51 吗?

其实也不麻烦
比如要执行 RL (左移一位)
可以先取最低字节, RLC (把移出的高位保存在 C ) 然后依次高字节都读入, 执行 RLC 指令 后写回. 所有字节都执行完, 也就完成了一次左移操作.
右移也类似处理, 要从高字节开始操作
wuhany 发表于 2020-6-26 19:28 | 显示全部楼层

#define PORT P1


void delay()
{
uint16_t i;
for(i=0; i<20000; i++);
}


void led_8()
{
uint8_t i;
uint8_t tmp = 0x01;
for(i=0; i<8; i++)
{
  PORT =  ~(tmp<<i);//左移
  delay();
}
tmp = 0x80;
for(i=0; i<8; i++)
{
  PORT =  ~(tmp>>i);//右移
  delay();
}
}

void main()
{
while(1)
{
  led_8();
}
}
jiaxw 发表于 2020-6-26 19:34 | 显示全部楼层

如果字节数是2,3,4时可以将数据类型定义为int或是long,
unsigned int dat;
dat<<11;
jiaxw 发表于 2020-6-26 19:38 | 显示全部楼层
如果字节数多了,只就能用5楼的办法了
huangchui 发表于 2020-6-26 19:41 | 显示全部楼层

楼上有几位说的非常好的了,我就不多做啥补充的了啊
不过呢,我只说一点的,就是你的变量至少需要是int型的才可以的
zhaoxqi 发表于 2020-6-26 19:44 | 显示全部楼层
现代的C都有“位移扩展指令”
午夜粪车 发表于 2020-6-26 19:46 | 显示全部楼层
移位要比做除法的指令简单。
liliang9554 发表于 2020-6-27 10:55 | 显示全部楼层
我能想到的办法就是“用指针跳转”了,实在不行就“C+汇编”混编吧。
 楼主| jiajs 发表于 2020-6-27 10:59 | 显示全部楼层
多谢各位大侠了啊
zhanghqi 发表于 2020-6-27 11:02 | 显示全部楼层
直接设计函数  
wuhany 发表于 2020-6-27 11:05 | 显示全部楼层
c++更简单一些。
dengdc 发表于 2020-6-27 11:08 | 显示全部楼层
这个c很难吗
zhuww 发表于 2020-6-27 11:13 | 显示全部楼层
寄存器的移位操作的还是需要多注意的
 楼主| jiajs 发表于 2020-6-27 11:17 | 显示全部楼层
嗯,那我按大家的说法挨个排查一下,谢谢哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

940

主题

11975

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部