Permute a string using Bit-Reversal
Haskell, 72 bytes

This is "permuting characters only", but is it shorter than a different approach?

s(a:b:c)|(x,y)&lt;-s c=(a:x,b:y)
s n=(n,n)
r a|[_]&lt;-a=a|(x,y)&lt;-s a=r x++r y


s is a helper function to seperate the characters from even and odd positions, r is the bit reversal permutation function:

Prelude&gt; r "codegolf"
"cgdlooef"