Reverse Arbitrary Length Bit String
From Wiki
Jump to navigationJump to search
This code will reverse any number of bits, from 2 to MAX_INT.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <stdint.h> #include <string.h> int debug = 0; // // // void flip (uint8_t *ptr, int bitLength) { int i; if (bitLength <= 1) return; if (debug) printf ("\n"); for (i = 0; i < bitLength / 2; i++) { int leftIndex = i / 8; int rightIndex = ((bitLength - 1) - i) / 8; int leftMask = 1 << (7 - (i % 8)); int rightMask = 1 << (7 - ((bitLength - 1) - i) % 8); int leftByte = ptr [leftIndex]; int rightByte = ptr [rightIndex]; int leftBit = leftByte & leftMask; int rightBit = rightByte & rightMask; if (debug) printf ("li=%d,ri=%d, lm=0x%02x,rm=0x%02x, lB=0x%02x,rB=0x%02x, lb=0x%02x,rb=0x%02x\n", leftIndex, rightIndex, leftMask, rightMask, leftByte, rightByte, leftBit, rightBit); if (leftIndex == rightIndex) { leftByte &= ~leftMask; leftByte &= ~rightMask; leftByte |= (rightBit ? leftMask : 0); leftByte |= (leftBit ? rightMask : 0); ptr [leftIndex] = leftByte; } else { leftByte &= ~leftMask; rightByte &= ~rightMask; leftByte |= (rightBit ? leftMask : 0); rightByte |= (leftBit ? rightMask : 0); ptr [leftIndex] = leftByte; ptr [rightIndex] = rightByte; } } } int main (int argc __attribute__ ((unused)), char **argv __attribute__ ((unused))) { const uint8_t test1 [] = { 0x40 }; // 01xx-xxxx -> 10xx-xxxx const uint8_t test2 [] = { 0x60 }; // 011x-xxxx -> 110x-xxxx const uint8_t test3 [] = { 0xaa }; // 1010-1010 -> 0101-0101 const uint8_t test4 [] = { 0xca, 0xfe }; // 1100-1010-1111-1110 -> 0111-1111-0101-0011 const uint8_t test5 [] = { 0xca, 0xfe, 0x80 }; // 1100-1010-1111-1110-1xxx-xxxx -> 1011-1111-1010-1001-1xxx-xxxx const uint8_t test6 [] = { 0xca, 0xfe, 0x80 }; // 1100-1010-1111-1110-10xx-xxxx -> 0101-1111-1101-0100-11xx-xxxx uint8_t buffer [16]; memcpy (buffer, test1, sizeof (test1)); flip (buffer, 2); printf ("test1: 2 bits, 0x40, should be 0x80, result is 0x%02x\n", buffer [0]); memcpy (buffer, test2, sizeof (test2)); flip (buffer, 3); printf ("test2: 3 bits, 0x60, should be 0xc0, result is 0x%02x\n", buffer [0]); memcpy (buffer, test3, sizeof (test3)); flip (buffer, 8); printf ("test3: 8 bits, 0xaa, should be 0x55, result is 0x%02x\n", buffer [0]); memcpy (buffer, test4, sizeof (test4)); flip (buffer, 16); printf ("test4: 16 bits, 0xcafe, should be 0x7f53, result is 0x%02x%02x\n", buffer [0], buffer [1]); memcpy (buffer, test5, sizeof (test5)); flip (buffer, 17); printf ("test4: 17 bits, 0xcafe80, should be 0xbfa980, result is 0x%02x%02x%02x\n", buffer [0], buffer [1], buffer [2]); memcpy (buffer, test6, sizeof (test6)); flip (buffer, 18); printf ("test4: 18 bits, 0xcafe80, should be 0x5fd4c0, result is 0x%02x%02x%02x\n", buffer [0], buffer [1], buffer [2]); exit (0); }