Bit reversal of an integer, ignoring integer size and endianness

后端 未结 12 2301
既然无缘
既然无缘 2021-01-03 00:18

Given an integer typedef:

typedef unsigned int TYPE;

or

typedef unsigned long TYPE;

I have the following

12条回答
  •  时光取名叫无心
    2021-01-03 00:51

    typedef unsigned long TYPE;
    
    TYPE reverser(TYPE n)
    {
        TYPE k = 1, nrev = 0, i, nrevbit1, nrevbit2;
        int count;
    
        for(i = 0; !i || (1 << i && (1 << i) != 1); i+=2)
        {
            /*In each iteration, we  swap one bit 
                on the 'right half' of the number with another 
                on the left half*/
    
            k = 1<>= count;
    
            nrev |= nrevbit1;
            nrev |= nrevbit2;
        }
        return nrev;
    }
    

    This works fine in gcc under Windows, but I'm not sure if it's completely platform independent. A few places of concern are:

    • the condition in the for loop - it assumes that when you left shift 1 beyond the leftmost bit, you get either a 0 with the 1 'falling out' (what I'd expect and what good old Turbo C gives iirc), or the 1 circles around and you get a 1 (what seems to be gcc's behaviour).

    • the condition in the inner while loop: see above. But there's a strange thing happening here: in this case, gcc seems to let the 1 fall out and not circle around!

    The code might prove cryptic: if you're interested and need an explanation please don't hesitate to ask - I'll put it up someplace.

提交回复
热议问题