Page 49

Write a function invert(x,p,n) that returns x with the n bits that begin at position p inverted (i.e., 1 changed into 0 and vice versa), leaving the others unchanged.

#include <limits.h>
#include <stdio.h>

unsigned invert(unsigned x, int p, int n);
void print_bits(unsigned x);

int main()
{
	print_bits(invert(0b10101010, 4, 3));
}

unsigned invert(unsigned x, int p, int n)
{
	return ~(~0 << n) << (p - n + 1) ^ x;
}

void print_bits(unsigned x)
{
	for (unsigned i = 1 << (sizeof(x) * CHAR_BIT - 1); i > 0; i >>= 1) {
		if (i & x) {
			putchar('1');
		} else {
			putchar('0');
		}
	}
}