Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
06/10/07 17:09
Modified:
  06/10/07 17:11

Read: times


 
#140510 - OK Then 39 Bytes...
Responding to: ???'s previous message
I want to take back the two bytes lost to the new 2 letter key words rule!! So here is a new version that clocks in at 39 bytes.
UC TestFlip(UC c) 
{
//UC r,i=8;WH(i--){r>>=1;r|=c&128;c*=2;}RT r;
//c=c/2&85|c*2&170;c=c/4&51|c*4&204;RT c>>4|c<<4;
UC r,i=8;WH(i--){r*=2;r|=c&1;c/=2;}RT r;
}

In considering how we are looking at the C language source code I was using the Keil C compiler to run and test this code instead of some PC code compiler. One thing I noticed was how well these obtuse and compact lines of C code collapse to optimized machine language. In some cases one could even use the assembler to figure out how the C code actually works!!

Cooper's 47 byte source code compiles to this efficient assembler code:
    78: UC TestFlip(UC c)
    79: {
    80: c=c/2&85|c*2&170;c=c/4&51|c*4&204;RT c>>4|c<<4;
C:0x006E    EF       MOV      A,R7
C:0x006F    C3       CLR      C
C:0x0070    13       RRC      A
C:0x0071    5455     ANL      A,#0x55
C:0x0073    FE       MOV      R6,A
C:0x0074    EF       MOV      A,R7
C:0x0075    25E0     ADD      A,ACC(0xE0)
C:0x0077    54AA     ANL      A,#0xAA
C:0x0079    4E       ORL      A,R6
C:0x007A    FF       MOV      R7,A
C:0x007B    13       RRC      A
C:0x007C    13       RRC      A
C:0x007D    5433     ANL      A,#0x33
C:0x007F    FE       MOV      R6,A
C:0x0080    EF       MOV      A,R7
C:0x0081    25E0     ADD      A,ACC(0xE0)
C:0x0083    25E0     ADD      A,ACC(0xE0)
C:0x0085    54CC     ANL      A,#TL2(0xCC)
C:0x0087    4E       ORL      A,R6
C:0x0088    FF       MOV      R7,A
C:0x0089    C4       SWAP     A
C:0x008A    54F0     ANL      A,#B(0xF0)
C:0x008C    FE       MOV      R6,A
C:0x008D    EF       MOV      A,R7
C:0x008E    C4       SWAP     A
C:0x008F    540F     ANL      A,#0x0F
C:0x0091    4E       ORL      A,R6
C:0x0092    FF       MOV      R7,A
    81: }
C:0x0093    22       RET


My most recent 39 byte source code collapses to this even smaller assembler code. Cooper's still would run faster for a time critical application because his is straight line code while on the other hand mine runs almost all of the assembler eight times in a loop.
    78: UC TestFlip(UC c)
    79: {
    80: UC r,i=8;WH(i--){r*=2;r|=c&1;c/=2;}RT r;
C:0x006E    7D08     MOV      R5,#0x08
C:0x0070    AC05     MOV      R4,0x05
C:0x0072    1D       DEC      R5
C:0x0073    EC       MOV      A,R4
C:0x0074    600F     JZ       C:0085
C:0x0076    EE       MOV      A,R6
C:0x0077    25E0     ADD      A,ACC(0xE0)
C:0x0079    FE       MOV      R6,A
C:0x007A    EF       MOV      A,R7
C:0x007B    5401     ANL      A,#0x01
C:0x007D    4206     ORL      0x06,A
C:0x007F    EF       MOV      A,R7
C:0x0080    C3       CLR      C
C:0x0081    13       RRC      A
C:0x0082    FF       MOV      R7,A
C:0x0083    80EB     SJMP     C:0070
C:0x0085    AF06     MOV      R7,0x06
    81: }
C:0x0087    22       RET



Note that both above compilations were done with the Keil C51 version 7.01 with the Optimization level set at #8.

Michael Karas


List of 87 messages in thread
TopicAuthorDate
Sunday Quiz - Bit Flipper in C            01/01/70 00:00      
   Here's My 41 Bytes            01/01/70 00:00      
      Very nice, but call it 43 (explained herein)            01/01/70 00:00      
   Sunday Quiz Update            01/01/70 00:00      
      OK Then 39 Bytes...            01/01/70 00:00      
         Oh my goodness            01/01/70 00:00      
            If you want performance...            01/01/70 00:00      
         More bytes, but ...            01/01/70 00:00      
   OK Then 38 Bytes            01/01/70 00:00      
      Comma            01/01/70 00:00      
         36! Holy cow! Very nice!            01/01/70 00:00      
            my 36            01/01/70 00:00      
               Non-conforming            01/01/70 00:00      
                  Wow! 34! |<3WL! :-)            01/01/70 00:00      
                     ???            01/01/70 00:00      
                        KEWL = cool in l33t :-) (worse than SMS...)            01/01/70 00:00      
                  Wow is right!!! plus another 36            01/01/70 00:00      
         Broken            01/01/70 00:00      
            C doesn't try to save you ...            01/01/70 00:00      
            Not Broken            01/01/70 00:00      
   look for samples of FFT code ...            01/01/70 00:00      
   this is competing to make the worst possible            01/01/70 00:00      
      it's certainly not the solution...            01/01/70 00:00      
         correction            01/01/70 00:00      
            Unless you're "porting" ...            01/01/70 00:00      
               there are situations...            01/01/70 00:00      
                  au contraire            01/01/70 00:00      
                     overlayed variables            01/01/70 00:00      
                        non-religious reasons and debunking some            01/01/70 00:00      
                           I doubt that            01/01/70 00:00      
                              now try            01/01/70 00:00      
                                 with the error or without?            01/01/70 00:00      
                                    the 49 is a compare the 48 is coding time            01/01/70 00:00      
                                       47, 48, 49            01/01/70 00:00      
                                          for such a cause as            01/01/70 00:00      
                                          Still more            01/01/70 00:00      
                                             one more point for Pascal            01/01/70 00:00      
                                                Language and vocabulary contributions            01/01/70 00:00      
                                                   Language and vocabulary contributions            01/01/70 00:00      
                                                Yes, it's much more "self-documenting"            01/01/70 00:00      
                                    Singular?            01/01/70 00:00      
                                 well... around 5 minutes            01/01/70 00:00      
                              It's not funny            01/01/70 00:00      
                                 this is why I don't like the "modern" over-windowe            01/01/70 00:00      
         Tastes            01/01/70 00:00      
      Skill in reading            01/01/70 00:00      
         in other words: because there are burglars detecti            01/01/70 00:00      
            That's why one should use ASM and not 'C'            01/01/70 00:00      
               nope            01/01/70 00:00      
                  are you perfect?            01/01/70 00:00      
                  That's why the documentation is necessary            01/01/70 00:00      
                     the old argument from C haters            01/01/70 00:00      
                     One page of comments per statement?            01/01/70 00:00      
                        If it's to be understood later on ...            01/01/70 00:00      
                           if I have to explain my choice of syntax in C, the            01/01/70 00:00      
                              The point is to show why, and not why-not            01/01/70 00:00      
                                 I post, you 'reply'            01/01/70 00:00      
                           Sorry, I still need more help on this            01/01/70 00:00      
                              Never had to do that ... and for good reason.            01/01/70 00:00      
                                 Maybe just one unclear point now            01/01/70 00:00      
                                    Well, if it were up to me ...            01/01/70 00:00      
                                       Thanks            01/01/70 00:00      
                                          I hope you're not missing my point ...            01/01/70 00:00      
                                             You explained yourself clearly            01/01/70 00:00      
                                 Upside down            01/01/70 00:00      
                                    Just look at the body of work ...            01/01/70 00:00      
                                       Nature of commercial software            01/01/70 00:00      
                                          Maybe it's more like a 747 vs. a bicycle            01/01/70 00:00      
                                    on driving and "coding"            01/01/70 00:00      
         even Mr. K agrees            01/01/70 00:00      
   Post Mortem #1            01/01/70 00:00      
      I object            01/01/70 00:00      
      Post Mortem #1.1            01/01/70 00:00      
         both translations are "strange"            01/01/70 00:00      
            Uninitialised?            01/01/70 00:00      
      20 bytes.            01/01/70 00:00      
         teaching the compiler...            01/01/70 00:00      
            Maybe for HLLs, but not for C ...            01/01/70 00:00      
               I know this is the praxis....            01/01/70 00:00      
         incorrect/incomplete statement            01/01/70 00:00      
   Post Mortem #2            01/01/70 00:00      
      Vote: 1. Yes 2. Dont care            01/01/70 00:00      
      modify it!!!!            01/01/70 00:00      
      vote            01/01/70 00:00      
         methink            01/01/70 00:00      
   its interesting that C            01/01/70 00:00      
      I like your proposal            01/01/70 00:00      

Back to Subject List