Best practices for circular shift (rotate) operations in C++

前端 未结 16 1562
情深已故
情深已故 2020-11-22 00:09

Left and right shift operators (<< and >>) are already available in C++. However, I couldn\'t find out how I could perform circular shift or rotate operations.

16条回答
  •  不知归路
    2020-11-22 00:51

    --- Substituting RLC in 8051 C for speed --- Rotate left carry
    Here is an example using RLC to update a serial 8 bit DAC msb first:
                                   (r=DACVAL, P1.4= SDO, P1.5= SCLK)
    MOV     A, r
    ?1:
    MOV     B, #8
    RLC     A
    MOV     P1.4, C
    CLR     P1.5
    SETB    P1.5
    DJNZ    B, ?1
    
    Here is the code in 8051 C at its fastest:
    sbit ACC_7  = ACC ^ 7 ; //define this at the top to access bit 7 of ACC
    ACC     =   r;
    B       =   8;  
    do  {
    P1_4    =   ACC_7;  // this assembles into mov c, acc.7  mov P1.4, c 
    ACC     <<= 1;
    P1_5    =   0;
    P1_5    =   1;
    B       --  ; 
        } while ( B!=0 );
    The keil compiler will use DJNZ when a loop is written this way.
    I am cheating here by using registers ACC and B in c code.
    If you cannot cheat then substitute with:
    P1_4    =   ( r & 128 ) ? 1 : 0 ;
    r     <<=   1;
    This only takes a few extra instructions.
    Also, changing B for a local var char n is the same.
    Keil does rotate ACC left by ADD A, ACC which is the same as multiply 2.
    It only takes one extra opcode i think.
    Keeping code entirely in C keeps things simpler sometimes.
    

提交回复
热议问题