想请教移位的问题,麻烦各位帮忙看看。
现在需要对一个32位的整形数进行移位。。unsigned long x=0xffffffff;
unsigned char y=3;
x>>=y;
但是我查看结果,移位的结果不正确,总感觉CPU还是按照8位的去移的,32位里面有4个字节,结果他还是每个字节都移出去三个位,导致了数据乱七八糟的。。。难道32位的不能移位操作么??? 0xffffffff=11111111 11111111 11111111 11111111
右移3位,变成了00011111 00011111 00011111 00011111 ,奇怪的问题。。。
按照理论应该是:00011111 11111111 11111111 11111111 才对吧。。。55555555{:cry:}
把unsigned char y=3;去掉,直接用X>>=3;试试呢 结果一样。。。 或者你把y也定义成unsigned long型
unsigned long y=3; 我都重复试验了N次了,都是这样的结果,但是16位的移位结果是正确的。。。{:cry:}
比如要移位>>8,结果变成0了,因为1全都被移出去了。。。 我的程序也是unsigned long 型,左移一位,没有问题 我从中午捣鼓到现在,都是这样的结果。。。单片机是
. 单片机型号: STC15F2K60S2
. 固件版本号: 7.1.4S
. 用户设定频率: 30.000MHz
. 调节后的频率: 30.022MHz
. 频率调节误差: 0.072%
用来做12864的图像平移用的。。。因为想到移位的速度比打点要快很多,才想到这个方法,结果怎么弄都不行。。。郁闷。。。 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;//这个缓冲区对应屏幕上的每个像素 可能还真的不支持32位的
页:
[1]