# Exercise 2.7-Setting bits at a position n Inverted¶

## Question¶

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.

```/**
*
* Exercise 2.7
*
* Write a function invert(x,p,n) that returns x with n bit starting at p
* inverted .
*
**/

#include <stdio.h>

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

int main(void) { printf("%u", (unsigned)invert((unsigned)8, (int)3, (int)3)); }

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

## Explanation¶

Let’s take n as 3:

```       ~(~0 << n) = ~(~0 << 3)
= ~(1111 1111 << 3)
= ~(1 1111 000 << 3)
= ~(1111 1000)
= 0000 0111

This sets the last n bits to 1 and rest to 0

The given position p  0 indexed and the number of bits, n is 1 indexed.
So in order to change the bits starting at position, p, we need to shift our
streams 1s to position p and we accomplish that by left shifting the stream of 1s to position (p+1-n)

For the position 3

We get::

~(~0 << n) << (p+1 -n)  = 0000 0111 << (3+1 -3)
= 0000 0111 << 1
= 000 0111 0
= 0000 1111
```

Inverting the bits can accomplished by the XOR operation `(^)`

So, a value like 8 which is 0000 1000 can be inverted can inverted from 3rd position onwards by:

```x ^ (~(~0 << n) << (p + 1 - n)) = 0000 1000 ^ 0000 1111
= 0000 1111
= 15
```