fork download
  1. #include <stdio.h>
  2. #include <memory.h>
  3.  
  4. unsigned getbits(unsigned x, int p, int n);
  5. void printbits(unsigned int x);
  6. unsigned int setbits(unsigned int x, int p, int n, unsigned int y);
  7. int setbits2(int x, int p, int n, int y);
  8.  
  9.  
  10. int main(void){
  11. unsigned int x = 65328;
  12. unsigned int y = 198;
  13. unsigned int res;
  14.  
  15. printbits(x);
  16. printbits(y);
  17.  
  18. res = setbits(x, 7, 3, y);
  19. printf("%s", "s = ");
  20. printbits(res);
  21.  
  22. res = setbits2(x, 7, 3, y);
  23. printf("%s", "s = ");
  24. printbits(res);
  25.  
  26. return 0;
  27. }
  28.  
  29. void printbits(unsigned int x){
  30. int i;
  31. int mask = 0x1;
  32.  
  33. for(i = 15; i >= 0; i--){
  34. printf("%d", (x >> i) & mask);
  35. if(!(i % 4)) putchar(' ');
  36. }
  37. putchar('\n');
  38. }
  39.  
  40. /*Èçâëåêàåò n áèò íà÷èíàÿ ñ p-òîé ïîçèöèè*/
  41. unsigned getbits(unsigned x, int p, int n){
  42. return (x >> (p+1-n)) & ~(~0 << n);
  43. }
  44.  
  45. unsigned int setbits(unsigned int x, int p, int n, unsigned int y){
  46. unsigned int bit_field;
  47. unsigned int mask = ~(~0 << n);
  48.  
  49. mask = ~(mask << (p+1-n));
  50.  
  51. /*Èçâëå÷åì êðàéíèå ïðàâûå áèòû àðãóìåíòà y*/
  52. bit_field = getbits(y, n-1, n);
  53. return x & mask | (bit_field << (p+1-n));
  54. }
  55.  
  56. int setbits2(int x, int p, int n, int y) {
  57. int mask = (~((~0) << n)) << p;
  58. return x & (~mask) | (y << p) & mask;
  59. }
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
1111 1111 0011 0000 
0000 0000 1100 0110 
s = 1111 1111 1101 0000 
s = 1111 1111 0011 0000