#include <stdio.h>
#include <stdint.h>
int main(void)
{
uint16_t w = 0xb2e3; // our 16 bit word
uint16_t mask0 = 0x0001; // mask for LS bit
uint16_t mask1 = 0x8000; // mask for MS bit
uint16_t shift = 15; // distance between high and low bit positions
int b;
for (b = 0; b < 8; ++b) // for each pair of low/high bits
{
uint16_t b0 = w & mask0; // get low bit
uint16_t b1 = w & mask1; // get high bit
w &= ~(mask0 | mask1); // clear low/high bit in word
b0 <<= shift; // swap bit positions
b1 >>= shift;
w |= (b0 | b1); // insert swapped bits back into word
mask0 <<= 1; // update masks for next pair of bits
mask1 >>= 1;
shift -= 2; // update distance for next pair of bits
}
printf("%#x\n", w
); // w should now contain 0xc74d
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KCmludCBtYWluKHZvaWQpCnsKICAgIHVpbnQxNl90IHcgPSAweGIyZTM7ICAgICAgICAgLy8gb3VyIDE2IGJpdCB3b3JkCiAgICB1aW50MTZfdCBtYXNrMCA9IDB4MDAwMTsgICAgIC8vIG1hc2sgZm9yIExTIGJpdAogICAgdWludDE2X3QgbWFzazEgPSAweDgwMDA7ICAgICAvLyBtYXNrIGZvciBNUyBiaXQKICAgIHVpbnQxNl90IHNoaWZ0ID0gMTU7ICAgICAgICAgLy8gZGlzdGFuY2UgYmV0d2VlbiBoaWdoIGFuZCBsb3cgYml0IHBvc2l0aW9ucwogICAgaW50IGI7CgogICAgZm9yIChiID0gMDsgYiA8IDg7ICsrYikgICAgICAvLyBmb3IgZWFjaCBwYWlyIG9mIGxvdy9oaWdoIGJpdHMKICAgIHsKICAgICAgICB1aW50MTZfdCBiMCA9IHcgJiBtYXNrMDsgLy8gZ2V0IGxvdyBiaXQKICAgICAgICB1aW50MTZfdCBiMSA9IHcgJiBtYXNrMTsgLy8gZ2V0IGhpZ2ggYml0CiAgICAgICAgdyAmPSB+KG1hc2swIHwgbWFzazEpOyAgIC8vIGNsZWFyIGxvdy9oaWdoIGJpdCBpbiB3b3JkCiAgICAgICAgYjAgPDw9IHNoaWZ0OyAgICAgICAgICAgIC8vIHN3YXAgYml0IHBvc2l0aW9ucwogICAgICAgIGIxID4+PSBzaGlmdDsKICAgICAgICB3IHw9IChiMCB8IGIxKTsgICAgICAgICAgLy8gaW5zZXJ0IHN3YXBwZWQgYml0cyBiYWNrIGludG8gd29yZAogICAgICAgIG1hc2swIDw8PSAxOyAgICAgICAgICAgICAvLyB1cGRhdGUgbWFza3MgZm9yIG5leHQgcGFpciBvZiBiaXRzCiAgICAgICAgbWFzazEgPj49IDE7CiAgICAgICAgc2hpZnQgLT0gMjsgICAgICAgICAgICAgIC8vIHVwZGF0ZSBkaXN0YW5jZSBmb3IgbmV4dCBwYWlyIG9mIGJpdHMgCiAgICB9CgogICAgcHJpbnRmKCIlI3hcbiIsIHcpOyAgICAgICAgICAvLyB3IHNob3VsZCBub3cgY29udGFpbiAweGM3NGQKCiAgICByZXR1cm4gMDsKfQo=