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');
}
}
}