这样的功能,谁帮我想句精简的C语句?谢谢了

[复制链接]
8368|47
 楼主| peter_2011 发表于 2011-4-6 22:32 | 显示全部楼层 |阅读模式
具体如下:
每按一下K1健,a=0x08<<1 ;
每按一下K2健,a=0x08>>1;

问题来了,
怎么样能使 当a=0x80  后,再按下K1健,a=0x01;
               当a=0x01后,再按下K2健,a=0x80;

我自己用if能实现,但是要用很多if  所以我自己写出来的太罗里罗嗦了,再这里求达人能帮我写句看上去精简点的 行吗? 谢谢了...
ljm810010 发表于 2011-4-6 23:21 | 显示全部楼层
if(K1) a=(a<<1)|(a>>7);
if(K2) a=(a>>1)|(a<<7);

评分

参与人数 1威望 +1 收起 理由
心静自然凉 + 1

查看全部评分

chang_feng_1 发表于 2011-4-7 00:21 | 显示全部楼层
顶楼上的
 楼主| peter_2011 发表于 2011-4-7 07:51 | 显示全部楼层
2# ljm810010

谢谢..很好的语句
gaohuating 发表于 2011-4-7 08:17 | 显示全部楼层
真是一个人才啊!
ayb_ice 发表于 2011-4-7 08:25 | 显示全部楼层
if(K1) a=(a<<1)|(a>>7);
if(K2) a=(a>>1)|(a<<7);
这样的语句看似高效,实则低效
ljm810010 发表于 2011-4-7 08:59 | 显示全部楼层
ayb_ice 正解,不要片面追求程序形式上的简洁,还要考虑执行效率。
对于AMR处理器,可能没有多大的区别,但对于51核的MCU,一个a>>7会让MCU累个半死。
刘前辈 发表于 2011-4-7 09:44 | 显示全部楼层
调用内联函数就行了:

#include<intrins.h>

a= _crol_(a,1);   //相当于 RL a
a= _cror_(a,1);   // 相当于 RR a

/
handlike 发表于 2011-4-7 09:57 | 显示全部楼层
思路很简捷,仰慕下 ljm810010
ljm810010 发表于 2011-4-7 10:19 | 显示全部楼层
8# 刘前辈

别迷恋C51的内联函数,处理一次要十几个指令周期,比直接用 if 判断慢多了。
  if (a == 0x80) a = 0x01; else a<<=1;
  if (a == 0x01) a = 0x80; else a>>=1;
sdpz 发表于 2011-4-7 11:31 | 显示全部楼层
这是当然啦,楼主的情况是只有一位有用数据的时候
a >>= 1;
if (!a) a = 0x80;
才几条指令。

但是刘前辈说的内联也不是慢,它支持多位循环的,功能不一样不能这样比较。用if做倒是吃力多了。
johnwjl 发表于 2011-4-7 11:40 | 显示全部楼层
如果楼主追求精简的话,请使用2楼或8楼写法。
如果楼主追求高效的话,请使用汇编。
以下两者折中:
if (k1)  {
   a <<= 1;
   if (a == 0)  {
         a = 0x01;
   }
}

if (k2)  {
   a >>= 1;
   if (a == 0)  {
         a = 0x08;
   }
}
joyme 发表于 2011-4-7 12:37 | 显示全部楼层
a = (a==0x80)?0x01:(a<<1);

a = (a==0x01)?0x80:(a>>1);
心静自然凉 发表于 2011-4-7 12:46 | 显示全部楼层
13# joyme
这个也好,不过还得再修改下
goldenriver 发表于 2011-4-7 13:39 | 显示全部楼层
学习了,好贴
刘前辈 发表于 2011-4-7 15:34 | 显示全部楼层
都不简单:

; a = (a==0x80)?0x01:(a<<1);
                        ; SOURCE LINE # 14
        CJNE         R7,#080H,?C0001
        MOV          R6,#01H
        SJMP         ?C0002
?C0001:
        MOV          A,R7
        ADD          A,ACC
        MOV          R6,A
?C0002:
        MOV          R7,AR6
;  
;
;
;  if (a == 0x80) a = 0x01; else a<<=1;
                        ; SOURCE LINE # 18
        CJNE         R7,#080H,?C0003
        MOV          R7,#01H
        SJMP         ?C0005
?C0003:
        MOV          A,R7
        ADD          A,ACC
        MOV          R7,A
?C0005:
;     while(1);
                        ; SOURCE LINE # 20
        SJMP         ?C0005
; END OF main

/
joyme 发表于 2011-4-7 15:49 | 显示全部楼层
LZ只是说c语言精简指令,至于对汇编后的指令,肯定是省不了的
sdpz 发表于 2011-4-7 15:54 | 显示全部楼层
擦。。。楼上正解。    “求达人能帮我写句   看上去   精简点  的”
ljm810010 发表于 2011-4-7 16:35 | 显示全部楼层
16# 刘前辈

刘前辈不妨把
a= _crol_(a,1);   //相当于 RL a
编译后看看。
swfc_qinmm 发表于 2011-4-7 16:36 | 显示全部楼层
受教了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

70

帖子

0

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