fork download
  1. #include <stdio.h>
  2.  
  3. unsigned setbits(unsigned x, int p, int n, unsigned y);
  4. unsigned getbits(unsigned x, int p, int n);
  5.  
  6. int main(void)
  7. {
  8. int x = 9713; // 0010 0101 1111 0001
  9. int y = 3500; // 0000 1101 1010 1100
  10.  
  11. printf("Setbit result: %d", setbits(x,11,4,y)); // expecting 0010 1100 1111 0001 - 11761
  12.  
  13. return 0;
  14. }
  15.  
  16. /* setbits: set n bits in x starting from position p to the rightmost n bits from y, leaving other bits unchanged */
  17. unsigned setbits(unsigned x, int p, int n, unsigned y)
  18. {
  19. int mask = ~(~0 << n) << (p - n + 1); // 0000 1111 0000 0000
  20. x &= ~mask; // 0010 0000 1111 0001
  21.  
  22. y = getbits(y,n-1,n); // 0000 0000 0000 1100
  23. y <<= (p - n + 1); // 0000 1100 0000 0000
  24.  
  25. return x | y; // 0010 1100 1111 0001
  26. }
  27.  
  28. /* getbits: get n bits from position p */
  29. unsigned getbits(unsigned x, int p, int n)
  30. {
  31. return (x >> (p+1-n)) & ~(~0 << n);
  32. }
  33.  
Success #stdin #stdout 0s 4308KB
stdin
Standard input is empty
stdout
Setbit result: 11505