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