打印

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

[复制链接]
6449|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

谢谢..很好的语句

使用特权

评论回复
5
gaohuating| | 2011-4-7 08:17 | 只看该作者
真是一个人才啊!

使用特权

评论回复
6
ayb_ice| | 2011-4-7 08:25 | 只看该作者
if(K1) a=(a<<1)|(a>>7);
if(K2) a=(a>>1)|(a<<7);
这样的语句看似高效,实则低效

使用特权

评论回复
7
ljm810010| | 2011-4-7 08:59 | 只看该作者
ayb_ice 正解,不要片面追求程序形式上的简洁,还要考虑执行效率。
对于AMR处理器,可能没有多大的区别,但对于51核的MCU,一个a>>7会让MCU累个半死。

使用特权

评论回复
8
刘前辈| | 2011-4-7 09:44 | 只看该作者
调用内联函数就行了:

#include<intrins.h>

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

/

使用特权

评论回复
9
handlike| | 2011-4-7 09:57 | 只看该作者
思路很简捷,仰慕下 ljm810010

使用特权

评论回复
10
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;

使用特权

评论回复
11
sdpz| | 2011-4-7 11:31 | 只看该作者
这是当然啦,楼主的情况是只有一位有用数据的时候
a >>= 1;
if (!a) a = 0x80;
才几条指令。

但是刘前辈说的内联也不是慢,它支持多位循环的,功能不一样不能这样比较。用if做倒是吃力多了。

使用特权

评论回复
12
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;
   }
}

使用特权

评论回复
13
joyme| | 2011-4-7 12:37 | 只看该作者
a = (a==0x80)?0x01:(a<<1);

a = (a==0x01)?0x80:(a>>1);

使用特权

评论回复
14
心静自然凉| | 2011-4-7 12:46 | 只看该作者
13# joyme
这个也好,不过还得再修改下

使用特权

评论回复
15
goldenriver| | 2011-4-7 13:39 | 只看该作者
学习了,好贴

使用特权

评论回复
16
刘前辈| | 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

/

使用特权

评论回复
17
joyme| | 2011-4-7 15:49 | 只看该作者
LZ只是说c语言精简指令,至于对汇编后的指令,肯定是省不了的

使用特权

评论回复
18
sdpz| | 2011-4-7 15:54 | 只看该作者
擦。。。楼上正解。    “求达人能帮我写句   看上去   精简点  的”

使用特权

评论回复
19
ljm810010| | 2011-4-7 16:35 | 只看该作者
16# 刘前辈

刘前辈不妨把
a= _crol_(a,1);   //相当于 RL a
编译后看看。

使用特权

评论回复
20
swfc_qinmm| | 2011-4-7 16:36 | 只看该作者
受教了……

使用特权

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

本版积分规则

0

主题

70

帖子

0

粉丝