17
typedef unsigned char Byte;

...

void ReverseBytes( void *start, int size )
{
    Byte *buffer = (Byte *)(start);

    for( int i = 0; i < size / 2; i++ ) {
        std::swap( buffer[i], buffer[size - i - 1] );
    }
}

What this method does right now is it reverses bytes in memory. What I would like to know is, is there a better way to get the same effect? The whole "size / 2" part seems like a bad thing, but I'm not sure.

EDIT: I just realized how bad the title I put for this question was, so I [hopefully] fixed it.

xian
  • 4,657
  • 5
  • 34
  • 38
  • Your example seems flawed, how can you swap two chars without a location? I suspect you need pass in the address. – leppie Feb 25 '09 at 16:45

5 Answers5

32

The standard library has a std::reverse function:

#include <algorithm>
void ReverseBytes( void *start, int size )
{
    char *istart = start, *iend = istart + size;
    std::reverse(istart, iend);
}
kmkaplan
  • 18,655
  • 4
  • 51
  • 65
  • Thanks. I should have looked it up before writing it myself. – xian Feb 25 '09 at 09:20
  • 1
    The description of the reverse function states that it is implemented exactly the way the person who asked the question implemented it and that it has the same complexity. It's not really a better way. A cleaner way maybe at best.. – Jules G.M. Feb 15 '13 at 16:23
26

A performant solution without using the STL:

void reverseBytes(void *start, int size) {
    unsigned char *lo = start;
    unsigned char *hi = start + size - 1;
    unsigned char swap;
    while (lo < hi) {
        swap = *lo;
        *lo++ = *hi;
        *hi-- = swap;
    }
}

Though the question is 3 ½ years old, chances are that someone else will be searching for the same thing. That's why I still post this.

Michael Manner
  • 513
  • 5
  • 10
2

If you need to reverse there is a chance that you can improve your algorithms and just use reverse iterators.

Mykola Golubyev
  • 57,943
  • 15
  • 89
  • 102
1

If you're reversing binary data from a file with different endianness you should probably use the ntoh* and hton* functions, which convert specified data sizes from network to host order and vice versa. ntohl for instance converts a 32 bit unsigned long from big endian (network order) to host order (little endian on x86 machines).

Rob K
  • 8,757
  • 2
  • 32
  • 36
0

I would review the stl::swap and make sure it's optimized; after that I'd say you're pretty optimal for space. I'm reasonably sure that's time-optimal as well.

Paul Nathan
  • 39,638
  • 28
  • 112
  • 212
  • Nowhere near time-optimal. The `size/2` calculation *might* be optimized out of being run every loop, but the `size-i-1` calculation wouldn't be, nor would the cost of the array indexing. That said, a perfectly optimized loop wouldn't be *that* much faster than what he's got. – Head Geek Feb 25 '09 at 21:41