lswhome 发表于 2014-5-23 17:02:28

想请教移位的问题,麻烦各位帮忙看看。

现在需要对一个32位的整形数进行移位。。
unsigned long x=0xffffffff;
unsigned char y=3;
x>>=y;

但是我查看结果,移位的结果不正确,总感觉CPU还是按照8位的去移的,32位里面有4个字节,结果他还是每个字节都移出去三个位,导致了数据乱七八糟的。。。难道32位的不能移位操作么???

lswhome 发表于 2014-5-23 17:15:08

0xffffffff=11111111 11111111 11111111 11111111
右移3位,变成了00011111 00011111 00011111 00011111 ,奇怪的问题。。。
按照理论应该是:00011111 11111111 11111111 11111111 才对吧。。。55555555{:cry:}

dlmaowf 发表于 2014-5-23 17:24:47

把unsigned char y=3;去掉,直接用X>>=3;试试呢

lswhome 发表于 2014-5-23 17:25:48

结果一样。。。

dlmaowf 发表于 2014-5-23 17:26:18

或者你把y也定义成unsigned long型
unsigned long y=3;

lswhome 发表于 2014-5-23 17:27:19

我都重复试验了N次了,都是这样的结果,但是16位的移位结果是正确的。。。{:cry:}
比如要移位>>8,结果变成0了,因为1全都被移出去了。。。

dlmaowf 发表于 2014-5-23 17:28:15

我的程序也是unsigned long 型,左移一位,没有问题

lswhome 发表于 2014-5-23 17:38:28

我从中午捣鼓到现在,都是这样的结果。。。单片机是
. 单片机型号: STC15F2K60S2
. 固件版本号: 7.1.4S

. 用户设定频率: 30.000MHz
. 调节后的频率: 30.022MHz
. 频率调节误差: 0.072%
用来做12864的图像平移用的。。。因为想到移位的速度比打点要快很多,才想到这个方法,结果怎么弄都不行。。。郁闷。。。

lswhome 发表于 2014-5-23 17:44:34

extern void GUI_Paint_Buff_Move(UINT8 flag,UINT8 Offset)//把缓冲区内的数据移位flag指定移动的方向移出的数据被丢失
{
        //Offset 指定要移动多少像素
        ULONG32 idata Buff;//缓冲区
        UINT8 idata i,i1,i2,i3;
        ULONG32 idata tmp;
       

        for(i2=0;i2<128;i2++)
        {
                i3=8;
                for(i1=0;i1<2;i1++)//取出第一个数据
                {
                        for(i=0;i<4;i++)
                                ((UINT8 *)&Buff) = DispBuff[ --i3 ] ;//读出来数据
                }
       
                if(flag==0)//向上移动Buff下半屏,Buff=上半屏
                {
                        tmp=Buff&(~(0xffffffff<<Offset));//先取出将要被移出的数据
       
                        Buff>>=Offset;//移出上半屏的数据
                        Buff>>=Offset;//移出下半屏的数据
                        Buff|=(tmp<<(32-Offset));//存入下半屏被移出的数据
                        i3=8;
                        for(i1=0;i1<2;i1++)//取出第一个数据
                        {
                                for(i=0;i<4;i++)
                                        DispBuff[ --i3 ] =        ((UINT8 *)&Buff);//修改后再写回去
                        }
                       
                }
                //ST7565_Delay(0xffff);ST7565_Delay(0xffff);ST7565_Delay(0xffff);ST7565_Delay(0xffff);
                //ST7565_Paint_Push_Data();//生成完毕,刷新显示
       }
}

显示缓冲这样定义的:
UINT8 xdata DispBuff;//这个缓冲区对应屏幕上的每个像素

gliet_su 发表于 2014-5-23 21:45:15

可能还真的不支持32位的
页: [1]
查看完整版本: 想请教移位的问题,麻烦各位帮忙看看。