#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');
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtZW1vcnkuaD4KCnVuc2lnbmVkIGdldGJpdHModW5zaWduZWQgeCwgaW50IHAsIGludCBuKTsKdm9pZCBwcmludGJpdHModW5zaWduZWQgaW50IHgpOwp1bnNpZ25lZCBpbnQgc2V0Yml0cyh1bnNpZ25lZCBpbnQgeCwgaW50IHAsIGludCBuLCB1bnNpZ25lZCBpbnQgeSk7CgoKaW50IG1haW4odm9pZCl7Cgl1bnNpZ25lZCBpbnQgeCA9IDA7Cgl1bnNpZ25lZCBpbnQgeSA9IDE5ODsKCXVuc2lnbmVkIGludCByZXM7CgkKCXJlcyA9IHNldGJpdHMoeCwgNywgMywgeSk7CglwcmludGJpdHMocmVzKTsKCQogCXJldHVybiAwOwp9CgovKtCY0LfQstC70LXQutCw0LXRgiBuINCx0LjRgiDQvdCw0YfQuNC90LDRjyDRgSBwLdC5INC/0L7Qt9C40YbQuNC4Ki8KdW5zaWduZWQgZ2V0Yml0cyh1bnNpZ25lZCB4LCBpbnQgcCwgaW50IG4pewoJcmV0dXJuICh4ID4+IChwKzEtbikpICYgfih+MCA8PCBuKTsKfQoKdW5zaWduZWQgaW50IHNldGJpdHModW5zaWduZWQgaW50IHgsIGludCBwLCBpbnQgbiwgdW5zaWduZWQgaW50IHkpewoJdW5zaWduZWQgaW50IGJpdF9maWVsZDsKCQoJcHJpbnRmKCIlcyIsICJ4ID0gIik7CglwcmludGJpdHMoeCk7CglwcmludGYoIiVzIiwgInkgPSAiKTsKCXByaW50Yml0cyh5KTsKCS8q0JjQt9Cy0LvQtdGH0LXQvCBuINC60YDQsNC50L3QuNGFINC/0YDQsNCy0YvRhSDQsdC40YIg0LDRgNCz0YPQvNC10L3RgtCwIHkqLwoJYml0X2ZpZWxkID0gZ2V0Yml0cyh5LCBuLTEsIG4pOwoJcHJpbnRmKCIlcyIsICJmID0gIik7CglwcmludGJpdHMoYml0X2ZpZWxkKTsKCXByaW50ZigiJXMiLCAiciA9ICIpOwoJcHJpbnRiaXRzKGJpdF9maWVsZCA8PCAocCsxLW4pKTsKCXJldHVybiB4IHwgKGJpdF9maWVsZCA8PCAocCsxLW4pKTsKfQoKdm9pZCBwcmludGJpdHModW5zaWduZWQgaW50IHgpewoJaW50IGk7CglpbnQgbWFzayA9IDB4MTsKCQoJZm9yKGkgPSAxNTsgaSA+PSAwOyBpLS0pewoJCXByaW50ZigiJWQiLCAoeCA+PiBpKSAmIG1hc2spOwoJCWlmKCEoaSAlIDQpKSBwdXRjaGFyKCcgJyk7Cgl9CglwdXRjaGFyKCdcbicpOwp9