Bitwise Rotate Right

后端 未结 5 2032
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-06 08:55

I am trying to convert this C function into Python;

typedef unsigned long var;
    /* Bit rotate rightwards */
    var ror(var v,unsigned int bits) {
        ret         


        
5条回答
  •  孤街浪徒
    2021-02-06 09:22

    Your C output doesn't match the function that you provided. That is presumably because you are not printing it correctly. This program:

    #include 
    #include 
    
    uint64_t ror(uint64_t v, unsigned int bits) 
    {
        return (v>>bits) | (v<<(8*sizeof(uint64_t)-bits));
    }
    
    int main(void)
    {
        printf("%llx\n", ror(0x0123456789abcdef, 4));
        printf("%llx\n", ror(0x0123456789abcdef, 8));
        printf("%llx\n", ror(0x0123456789abcdef, 12));
        printf("%llx\n", ror(0x0123456789abcdef, 16));
        return 0;
    }
    

    produces the following output:

    f0123456789abcde
    ef0123456789abcd
    def0123456789abc
    cdef0123456789ab
    

    To produce an ror function in Python I refer you to this excellent article: http://www.falatic.com/index.php/108/python-and-bitwise-rotation

    This Python 2 code produces the same output as the C program above:

    ror = lambda val, r_bits, max_bits: \
        ((val & (2**max_bits-1)) >> r_bits%max_bits) | \
        (val << (max_bits-(r_bits%max_bits)) & (2**max_bits-1))
    
    print "%x" % ror(0x0123456789abcdef, 4, 64)
    print "%x" % ror(0x0123456789abcdef, 8, 64)
    print "%x" % ror(0x0123456789abcdef, 12, 64)
    print "%x" % ror(0x0123456789abcdef, 16, 64)
    

提交回复
热议问题