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

前端 未结 16 1552
情深已故
情深已故 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.
    
    0 讨论(0)
  • 2020-11-22 00:56

    Definitively:

    template<class T>
    T ror(T x, unsigned int moves)
    {
      return (x >> moves) | (x << sizeof(T)*8 - moves);
    }
    
    0 讨论(0)
  • 2020-11-22 00:58

    If x is an 8 bit value, you can use this:

    x=(x>>1 | x<<7);
    
    0 讨论(0)
  • 2020-11-22 00:58

    Overload a function:

    unsigned int rotate_right(unsigned int x)
    {
     return (x>>1 | (x&1?0x80000000:0))
    }
    
    unsigned short rotate_right(unsigned short x) { /* etc. */ }
    
    0 讨论(0)
提交回复
热议问题