#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;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtZW1vcnkuaD4KCnVuc2lnbmVkIGdldGJpdHModW5zaWduZWQgeCwgaW50IHAsIGludCBuKTsKdm9pZCBwcmludGJpdHModW5zaWduZWQgaW50IHgpOwp1bnNpZ25lZCBpbnQgc2V0Yml0cyh1bnNpZ25lZCBpbnQgeCwgaW50IHAsIGludCBuLCB1bnNpZ25lZCBpbnQgeSk7CmludCBzZXRiaXRzMihpbnQgeCwgaW50IHAsIGludCBuLCBpbnQgeSk7CgoKaW50IG1haW4odm9pZCl7Cgl1bnNpZ25lZCBpbnQgeCA9IDY1MzI4OwoJdW5zaWduZWQgaW50IHkgPSAxOTg7Cgl1bnNpZ25lZCBpbnQgcmVzOwoJCglwcmludGJpdHMoeCk7CglwcmludGJpdHMoeSk7CgkKCXJlcyA9IHNldGJpdHMoeCwgNywgMywgeSk7CglwcmludGYoIiVzIiwgInMgPSAiKTsKCXByaW50Yml0cyhyZXMpOwoJCglyZXMgPSBzZXRiaXRzMih4LCA3LCAzLCB5KTsKCXByaW50ZigiJXMiLCAicyA9ICIpOwoJcHJpbnRiaXRzKHJlcyk7CgkKIAlyZXR1cm4gMDsKfQoKdm9pZCBwcmludGJpdHModW5zaWduZWQgaW50IHgpewoJaW50IGk7CglpbnQgbWFzayA9IDB4MTsKCQoJZm9yKGkgPSAxNTsgaSA+PSAwOyBpLS0pewoJCXByaW50ZigiJWQiLCAoeCA+PiBpKSAmIG1hc2spOwoJCWlmKCEoaSAlIDQpKSBwdXRjaGFyKCcgJyk7Cgl9CglwdXRjaGFyKCdcbicpOwp9CgovKsOIw6fDosOrw6XDqsOgw6XDsiBuIMOhw6jDsiDDrcOgw7fDqMOtw6DDvyDDsSBwLcOyw67DqSDDr8Ouw6fDqMO2w6jDqCovCnVuc2lnbmVkIGdldGJpdHModW5zaWduZWQgeCwgaW50IHAsIGludCBuKXsKCXJldHVybiAoeCA+PiAocCsxLW4pKSAmIH4ofjAgPDwgbik7Cn0KCnVuc2lnbmVkIGludCBzZXRiaXRzKHVuc2lnbmVkIGludCB4LCBpbnQgcCwgaW50IG4sIHVuc2lnbmVkIGludCB5KXsKCXVuc2lnbmVkIGludCBiaXRfZmllbGQ7Cgl1bnNpZ25lZCBpbnQgbWFzayA9IH4ofjAgPDwgbik7CgkKCW1hc2sgPSB+KG1hc2sgPDwgKHArMS1uKSk7CgoJLyrDiMOnw6LDq8Olw7fDpcOsIMOqw7DDoMOpw63DqMOlIMOvw7DDoMOiw7vDpSDDocOow7LDuyDDoMOww6PDs8Osw6XDrcOyw6AgeSovCgliaXRfZmllbGQgPSBnZXRiaXRzKHksIG4tMSwgbik7CglyZXR1cm4geCAmIG1hc2sgfCAoYml0X2ZpZWxkIDw8IChwKzEtbikpOwp9CgppbnQgc2V0Yml0czIoaW50IHgsIGludCBwLCBpbnQgbiwgaW50IHkpIHsKICAgIGludCBtYXNrID0gKH4oKH4wKSA8PCBuKSkgPDwgcDsKICAgIHJldHVybiB4ICYgKH5tYXNrKSB8ICh5IDw8IHApICYgbWFzazsKfQ==