设一个 *** 作数x有s位则循环左移n位的 *** 作为:
(x << n) | (x >> (s - n));
同理右移n位位:
(x >> n) | (x << (s - n));
你可以#define XX (x<<n) | (x>>(s-n)
。。。
补充下:上面是当 n<=s的情况 当n>s的话 只要把n改为 (n%s)就可以了左移
右移都是位运算
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(二进制)char ledmove[]={0x01,0x02,0x04,0x08};
void set_led(char p,char mode)
{
char ip;
ip = ledmove[p&0x03];
if((ip&0x01)==0) deng1 = 0;//管脚置o置1
else deng1 = 1;
if((ip&0x03)==0) deng2 = 0;
else deng2= 1;
if((ip&0x01)==0) deng3= 0;
else deng3 = 1;
if((ip&0x01)==0) deng4 = 0;
else deng4 = 1;
}
void main()
{
int i;
while(1)
{
for(i=0;i<4;i++)
{ if(anjian==0)//判断按键
setled(i);
else setled(3-i);
delay(1);//移动的速度
}
if(i>=4) i = 0;
}
}
应该是可以实现的吧,你去试试看
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)