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