#include <stdio.h>
#include <memory.h>

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


int main(void){
	unsigned int x = 0;
	unsigned int y = 198;
	unsigned int res;
	
	res = setbits(x, 7, 3, y);
	printbits(res);
	
 	return 0;
}

/*Извлекает n бит начиная с p-й позиции*/
unsigned getbits(unsigned x, int p, int n){
	return (x >> (p+1-n)) & ~(~0 << n);
}

unsigned int setbits(unsigned int x, int p, int n, unsigned int y){
	unsigned int bit_field;
	
	printf("%s", "x = ");
	printbits(x);
	printf("%s", "y = ");
	printbits(y);
	/*Извлечем n крайних правых бит аргумента y*/
	bit_field = getbits(y, n-1, n);
	printf("%s", "f = ");
	printbits(bit_field);
	printf("%s", "r = ");
	printbits(bit_field << (p+1-n));
	return x | (bit_field << (p+1-n));
}

void printbits(unsigned int x){
	int i;
	int mask = 0x1;
	
	for(i = 15; i >= 0; i--){
		printf("%d", (x >> i) & mask);
		if(!(i % 4)) putchar(' ');
	}
	putchar('\n');
}