Page 49

Write a function setbits(x,p,n,y) that returns x with the n bits that begin at position p set to the rightmost n bits of y, leaving the other bits unchanged.

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

unsigned setbits(unsigned x, int p, int n, unsigned y);
void print_bits(unsigned x);

int main()
{
	print_bits(setbits(0b00000000, 4, 3, 0b10101111));
}

unsigned setbits(unsigned x, int p, int n, unsigned y)
{
	return x & ~(~(~0 << n) << (p - n + 1)) |
	       ~(~0 << n) << (p - n + 1) & y << (p - n + 1);
}

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