#include <stdio.h>
unsigned setbits(unsigned x, int p, int n, unsigned y);
unsigned getbits(unsigned x, int p, int n);
int main(void)
{
int x = 9713; // 0010 0101 1111 0001
int y = 3500; // 0000 1101 1010 1100
printf("Setbit result: %d", setbits
(x
,11,4,y
)); // expecting 0010 1100 1111 0001 - 11761
return 0;
}
/* setbits: set n bits in x starting from position p to the rightmost n bits from y, leaving other bits unchanged */
unsigned setbits(unsigned x, int p, int n, unsigned y)
{
int mask = ~(~0 << n) << (p - n + 1); // 0000 1111 0000 0000
x &= ~mask; // 0010 0000 1111 0001
y = getbits(y,n-1,n); // 0000 0000 0000 1100
y <<= (p - n + 1); // 0000 1100 0000 0000
return x | y; // 0010 1100 1111 0001
}
/* getbits: get n bits from position p */
unsigned getbits(unsigned x, int p, int n)
{
return (x >> (p+1-n)) & ~(~0 << n);
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp1bnNpZ25lZCBzZXRiaXRzKHVuc2lnbmVkIHgsIGludCBwLCBpbnQgbiwgdW5zaWduZWQgeSk7CnVuc2lnbmVkIGdldGJpdHModW5zaWduZWQgeCwgaW50IHAsIGludCBuKTsKCmludCBtYWluKHZvaWQpCnsKCWludCB4ID0gOTcxMzsJLy8gMDAxMCAwMTAxIDExMTEgMDAwMQoJaW50IHkgPSAzNTAwOyAgIC8vIDAwMDAgMTEwMSAxMDEwIDExMDAKCQoJcHJpbnRmKCJTZXRiaXQgcmVzdWx0OiAlZCIsIHNldGJpdHMoeCwxMSw0LHkpKTsgLy8gZXhwZWN0aW5nIDAwMTAgMTEwMCAxMTExIDAwMDEgLSAxMTc2MQoJCglyZXR1cm4gMDsKfQoKLyogc2V0Yml0czogc2V0IG4gYml0cyBpbiB4IHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gcCB0byB0aGUgcmlnaHRtb3N0IG4gYml0cyBmcm9tIHksIGxlYXZpbmcgb3RoZXIgYml0cyB1bmNoYW5nZWQgKi8KdW5zaWduZWQgc2V0Yml0cyh1bnNpZ25lZCB4LCBpbnQgcCwgaW50IG4sIHVuc2lnbmVkIHkpCnsKCWludCBtYXNrID0gfih+MCA8PCBuKSA8PCAocCAtIG4gKyAxKTsJLy8gMDAwMCAxMTExIDAwMDAgMDAwMAoJeCAmPSB+bWFzazsJCQkJLy8gMDAxMCAwMDAwIDExMTEgMDAwMQoKCXkgPSBnZXRiaXRzKHksbi0xLG4pOwkJCS8vIDAwMDAgMDAwMCAwMDAwIDExMDAKCXkgPDw9IChwIC0gbiArIDEpOwkJCS8vIDAwMDAgMTEwMCAwMDAwIDAwMDAKCQoJcmV0dXJuIAl4IHwgeTsJCQkJLy8gMDAxMCAxMTAwIDExMTEgMDAwMQp9CgovKiBnZXRiaXRzOiBnZXQgbiBiaXRzIGZyb20gcG9zaXRpb24gcCAqLwp1bnNpZ25lZCBnZXRiaXRzKHVuc2lnbmVkIHgsIGludCBwLCBpbnQgbikKewoJcmV0dXJuICh4ID4+IChwKzEtbikpICYgfih+MCA8PCBuKTsKfQo=