打印

多字节移位问题

[复制链接]
1572|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kangzj|  楼主 | 2012-9-15 23:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前辈们,指点一下哟。    原来用汇编编程很容易的就进行多字节的移位,现在刚开始学用Keil  C编程,就搞不懂从哪下手:

    就是比如一次性移位11个字节,比如左移,将最高字节的最高位移出丢失,并将下一字节的最高位移进前一字节的最低位,如此进行将后10个字节的最高位分别移进其前一字节的最低位,最后一个字节的最低位补0(或补1)。右移反过来。

相关帖子

沙发
kangzj|  楼主 | 2012-9-15 23:18 | 只看该作者
汇编的时候有RRL,RRC就搞定了,C怎么弄啊?

使用特权

评论回复
板凳
llljh| | 2012-9-15 23:22 | 只看该作者
不懂,帮顶一个

使用特权

评论回复
地板
pangb| | 2012-9-15 23:23 | 只看该作者
后10个字节的最高位分别移进其前一字节的最低位?我怎么没明白

使用特权

评论回复
5
morrisk| | 2012-9-15 23:28 | 只看该作者
比如有这些字节要参与移位: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个字节顺次向前移一位,如果要连续移多位,再加个循环控制就行了。

使用特权

评论回复
6
pangb| | 2012-9-15 23:30 | 只看该作者
#include <AT89X51.H>
#include <../stdint.h>

#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();
}
}

使用特权

评论回复
7
小小猫咪| | 2012-9-15 23:31 | 只看该作者
如果字节数是2,3,4时可以将数据类型定义为int或是long,
unsigned int dat;
dat<<11;
如果字节数多了,只就能用5楼的办法了

使用特权

评论回复
8
kangzj|  楼主 | 2012-9-15 23:33 | 只看该作者
我理解理解,多谢各位啊

使用特权

评论回复
9
kangzj|  楼主 | 2012-9-15 23:35 | 只看该作者
先结贴了,大伙晚安哈

使用特权

评论回复
10
shenmulzb1985| | 2012-9-17 16:24 | 只看该作者
跟楼上学习了,5楼6楼的讲的还是蛮好的

使用特权

评论回复
11
gaochy1126| | 2012-9-17 18:40 | 只看该作者
>> 或则会<<函数就可以了

使用特权

评论回复
12
宝挖小子| | 2012-10-12 09:15 | 只看该作者
要将 (char)b 的最高位  移到 (char)a 的最低位:
b<<=1;
temp=CY;
a=(a<<1)|temp;//a的最高位被移出,最低位是b的最高位

使用特权

评论回复
13
爱之翼V| | 2012-10-12 15:58 | 只看该作者
噢,是这样形成的。学习了。

使用特权

评论回复
14
springspring| | 2012-10-13 20:22 | 只看该作者
我也明白了,受教

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

672

主题

7007

帖子

2

粉丝