#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 setbits2(int x, int p, int n, int y);


int main(void){
	unsigned int x = 65328;
	unsigned int y = 198;
	unsigned int res;
	
	printbits(x);
	printbits(y);
	
	res = setbits(x, 7, 3, y);
	printf("%s", "s = ");
	printbits(res);
	
	res = setbits2(x, 7, 3, y);
	printf("%s", "s = ");
	printbits(res);
	
 	return 0;
}

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

/*Èçâëåêàåò 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;
	unsigned int mask = ~(~0 << n);
	
	mask = ~(mask << (p+1-n));

	/*Èçâëå÷åì êðàéíèå ïðàâûå áèòû àðãóìåíòà y*/
	bit_field = getbits(y, n-1, n);
	return x & mask | (bit_field << (p+1-n));
}

int setbits2(int x, int p, int n, int y) {
    int mask = (~((~0) << n)) << p;
    return x & (~mask) | (y << p) & mask;
}