打印

**,实在是强啊…………小弟我佩服佩服~~~!

[复制链接]
楼主: ztzer
手机看帖
扫描二维码
随时随地手机跟帖
21

终于给看懂了

不知道什么时候我也能自己弄出来。

使用特权

评论回复
22
John_Lee| | 2008-12-12 20:06 | 只看该作者

还有更简单的,但前提是该CPU被gcc支持,并且有计算前导0的

unsigned int change (unsigned int val) {
    unsigned int result = (unsigned int) -1;
    result >>= builtin_clz (val);
    return result & (val | -val);
}

使用特权

评论回复
23
原野之狼| | 2008-12-12 20:24 | 只看该作者

John_Lee强悍~

使用特权

评论回复
24
ZTZER| | 2008-12-13 11:45 | 只看该作者

谢谢各位

决定像 耕在此行 说的那么写,跟诸位留下的程序差不多。谢谢了。

使用特权

评论回复
25
耕在此行| | 2008-12-13 16:06 | 只看该作者

呵呵

本人觉得做什么事情主要还是一种思路。
思路对了,具体的程序自然不是问题了。
所以很多时候,给指点一下就好,具体的程序,写了半天,提问的人还不一定看得明白。

使用特权

评论回复
26
ljm810010| | 2008-12-13 16:47 | 只看该作者

想了一下,还有一种思路更快,还未验证,待会试一下

使用特权

评论回复
27
ljm810010| | 2008-12-13 19:51 | 只看该作者

24周期,这个应是最快的吧,呵呵!

待转数据放在R7,转完后放于ACC


CONVERT:
    MOV A,#00000011b
    CJNE R7,#10H,$+3
    JC L1
    MOV A,#00111111b
L1: CJNE A,7,$+3
    JC L2
    RRC A        ;00000001  00011111
    SJMP L3
L2: RLC A        ;00000111  01111111
L3: CJNE A,7,$+3
    JNC L4
    RLC A        ;00000011  00001111 00111111 11111111
L4: MOV R6,A
    MOV A,R7
    CPL A
    INC A
    ORL A,R7
    ANL A,R6
    RET

使用特权

评论回复
28
幻阁| | 2008-12-13 23:27 | 只看该作者

方法很多嘛

好像我们今天微机原理实验的考试题目啊,easy!

使用特权

评论回复
29
幻阁| | 2008-12-13 23:31 | 只看该作者

宿舍要熄灯了,要不给你写个程序

明天再来...

使用特权

评论回复
30
红心j| | 2008-12-14 01:53 | 只看该作者

如果只是一个8BIT字节,还是查表的好

使用特权

评论回复
31
ztzer|  楼主 | 2008-12-16 08:46 | 只看该作者

我只要一个思路。

实际中我的数是有12位的,我现在的做法就是先从左判断,看判断到第几位为1,然后在从右判断,判断到第几位为1.然后将它们中间的位全定义为1.

使用特权

评论回复
32
John_Lee| | 2008-12-16 12:20 | 只看该作者

已经告诉你右边不需要判断,还不懂吗?

人家ljm810010可是一说就明白,LZ要多努力啊。

使用特权

评论回复
33
dengm| | 2008-12-16 13:34 | 只看该作者

【非典1】18 周期 90 bytes

SUB_CONV:
     MOV B, A           ;1
     ANL A, #11111100B  ;2
     CJNE A, B, LR1     ;4
       ANL A, #11110000B;5
       CJNE A, B, LR2   ;7
         ANL A, #11000000B;8
         CJNE A, B, LR3 ;10
           ;RET
           NOP       ;11
           NOP       ;12
           SJMP LR88B ;14           
;----------------------------
LR1:
      MOV A, B           ;5
      ANL A, #00111111B  ;6
      CJNE A, B, LRL11   ;8
        ANL A, #00001111B ;9
        CJNE A, B, LRL12  ;11
          ANL A, #00000011B;12
          CJNE A, B, LRL13 ;14
LR88B:
            SJMP LR88      ;16            

LRL11:
        ;MOV A, #01111110B; 9
        ;ORL A, B         ; 10
        ;RET              
        ORL B, #01111110B ;10        
        NOP               ;11

LRL12:
       ; MOV A, #00011110B;12
       ; ORL A, B         ;13
       ; RET              
        ORL B, #00011110B ;13
        NOP               ;14 

LRL13:
        MOV A, #00000110B;15
        ORL A, B         ;16
        RET              
;--------------------------------
LR2:
      MOV A, B           ;8
      ANL A, #00111111B  ;9
      CJNE A, B, LR21    ;11
        ANL A, #00001111B;12
        CJNE A, B, LR22  ;14     
          ;RET            
          SJMP LR88      ;16

LR21:
        ;MOV A, #01111000B;12
        ;ORL A, B         ;13
        ;RET              
        ORL B, #01111000B ;13
        NOP               ;14
LR22:
        MOV A, #00011000B;15
        ORL A, B         ;16
        RET              
;-------------------------------
LR3:
      MOV A, B           ;11
      ANL A, #00111111B  ;12
      CJNE A, B, LR31    ;14
        ;RET
        SJMP  LR88       ;16              
LR31:
      MOV A, #01100000B  ;15
      ORL A, B           ;16
LR88:
      RET

使用特权

评论回复
34
ljm810010| | 2008-12-16 14:56 | 只看该作者

dengm啊,你让别人逞一次强行不行? ^_^

【非典】 一出鬼神惊,非要稳坐盟主地位。

使用特权

评论回复
35
yewuyi| | 2008-12-16 15:06 | 只看该作者

好闲的人。。。

使用特权

评论回复
36
dengm| | 2008-12-16 20:29 | 只看该作者

【非典2】21 周期 55 bytes

SUB_CANV:
       MOV R7, A     ;1
       ANL A, #0FH   ;2
       ADD A, #(DT_TAB-$-3) ;3
       MOVC A, @A+PC ;5
       JNZ L1        ;7
         MOV A, R7   ;8
         SWAP A      ;9
         ADD A, #(DT_TAB-$-3) ;10
         MOVC A, @A+PC ;  ;12
         MOV R7, A     ;13 
         MOV A, #0FH   ;14
L1A:
         ANL A, R7     ;15
         SWAP A        ;16
         SJMP L3       ;18

L1:
       XCH A, R7     ;8
       ANL A, #0F0H  ;9
       JNZ L2        ;11 
         MOV A, #0F0H;12
         SJMP L1A    ;14 

L2:
       SWAP A        ;12
       ADD A, #(DT_TAB-$-3) ;13
       MOVC A, @A+PC ;15
       ORL A, #0FH   ;16
       XCH A, R7     ;17
       ORL A, #0F0H  ;18
L3:
       ANL A, R7     ;19
       RET


DT_TAB:
       DB 00000000B ;0000
       DB 00011111B ; 0001
       DB 00111110B ; 0010
       DB 00111111B ; 0011
       DB 01111100B ; 0100
       DB 01111111B ; 0101
       DB 01111110B ; 0110
       DB 01111111B ; 0111
       DB 11111111B ; 1001
       DB 11111110B ; 1010
       DB 11111111B ; 1011
       DB 11111100B ; 1100
       DB 11111111B ; 1101
       DB 11111110B ; 1110
       DB 11111111B ; 1111
;------------------END  OF SUB_CANV -----

使用特权

评论回复
37
ljm810010| | 2008-12-16 20:41 | 只看该作者

呵呵,正编着一个18cys,66byt的,还没验证,又被抢先了

方法相似,也是查表,还有一个21cys,50bytes的。

使用特权

评论回复
38
dengm| | 2008-12-16 22:13 | 只看该作者

【非典3(终结)】15 周期 69 bytes

SUB_CANV:
         MOV B, A            ;1
        ANL A, #00111111B   ;2
        CJNE A, B, L2       ;4
          ; 00XX-XXXX
          ANL A, #00001111B ;5
          CJNE A, B, L1     ;7
            ;0000-XXXX
            ADD A, #(DT_TAB-$-3) ;8
            MOVC A, @A+PC     ;10 SSSS-XXXX
            ANL A, #11110000B ;11
            SWAP A            ;12
            NOP               ;13
            RET


L1:     ;00??-XXXX
         ADD A, #(DT_TAB-$-3) ;8    
         MOVC A, @A+PC        ;10  SSSS-XXXX 
         ANL A, #00001111B     ;11
         ORL A, #00010000B     ;12
         ORL A, B              ;13
         RET

L2:     ;??XX-XXXX
        ANL A, #00001111B ;5
        JZ L3             ;7
          ;??XX-XXXX
          ADD A, #(DT_TAB-$-3) ;8
          MOVC A, @A+PC         ;10  SSSS-XXXX
          ANL A, #00001111B     ;11
          ORL A, #01110000B     ;12
          ORL A, B              ;13
          RET

          
L3:     ;??XX-0000B
         MOV A, B ;8
         SWAP A   ;9
         ADD A, #(DT_TAB-$-3) ;10
         MOVC A, @A+PC         ;12  ;SSSS-XXXX
         ANL A, #11110000B     ;13
         RET


DT_TAB:
       DB 00000000B ;0000
       DB 00011111B ; 0001
       DB 00101110B ; 0010
       DB 00111111B ; 0011
       DB 01001100B ; 0100
       DB 01111111B ; 0101
       DB 01101110B ; 0110
       DB 01111111B ; 0111
       DB 10001000B ; 1000
       DB 11111111B ; 1001
       DB 11101110B ; 1010
       DB 11111111B ; 1011
       DB 11001100B ; 1100
       DB 11111111B ; 1101
       DB 11101110B ; 1110
       DB 11111111B ; 1111
 
 ;-----------END  OF SUB_CANV -----


使用特权

评论回复
39
ljm810010| | 2008-12-16 22:29 | 只看该作者

晕,又慢了


18周期,66字节
;=================================
Convert:
    mov r7,a
    mov r6,a
    anl a,#00001111b
    add a,#(Tab1-$-3)
    movc a,@a+pc
    xch a,r7
    swap a
    anl a,#00001111b
    add a,#(Tab2-$-3)
    movc a,@a+pc
    add a,r7
    movc a,@a+pc
    orl a,r6
    ret

Tab0:    db 00000000b,00000000b,00000000b,00000110b,00000000b,00011110b,00011000b,00011110b
        db 00000000b,01111110b,01111000b,01111110b,01100000b,01111110b,01111000b,01111110b
Tab1:    db 2,3,3,3,4,5,5,5,4,5,5,5,4,5,5,5
Tab2:    db 0,4,4,4,8,12,12,12,8,12,12,12,8,12,12,12


20周期,54字节
;==============================
Convert:
    mov r7,a
    mov r6,a
    anl a,#00001111b
    add a,#(Tab1-$-3)
    movc a,@a+pc
    xch a,r7
    swap a
    anl a,#00001111b
    add a,#(Tab1-$-3)
    movc a,@a+pc
    rl a
    rl a
    add a,r7
    movc a,@a+pc
    orl a,r6
    ret
Tab1:    db 4,5,5,5,6,7,7,7,6,7,7,7,6,7,7,7,0,0
Tab0:    db 00000000b,00000000b,00000000b,00000110b,00000000b,00011110b,00011000b,00011110b
        db 00000000b,01111110b,01111000b,01111110b,01100000b,01111110b,01111000b,01111110b

使用特权

评论回复
40
ljm810010| | 2008-12-17 09:32 | 只看该作者

15周期,32字节,嘿嘿,呵呵,我是欧阳疯,呼呼,哈哈...

Convert:
    mov  r7,a
    rr   a
    orl  a,r7
    anl  a,#55h
    mov  r6,a
    swap a
    rl   a
    orl  a,r6
    anl  a,#0fh
    add  a,#(Tab-$-3)
    movc a,@a+pc
    orl  a,r7      ;dengm的点睛之笔
    ret
Tab:db  00h,00h,00h,1eh,00h,06h,18h,1eh,00h,7eh,60h,7eh,78h,7eh,78h,7eh     
    end

用C来表达,就这两句:
  Dest=(Source|(Source>>1))&0x55;
  Dest=Tab[(Dest|(Dest>>3))&0x0f]|Source;



使用特权

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

本版积分规则