#include<stdio.h>
#include<math.h>
int count_bits(unsigned x) {
int bits = 0;
while (x) {
if (x & 1u) bits++;
x >>= 1;
}
return bits;
}
int int_bits(void) {
return count_bits(~0u);
}
void print_bits(unsigned x) {
int i = int_bits() - 1;
for (;i >= 0; i--) {
putchar(((x >> i) & 1u) ? '1' : '0');
}
putchar('\n');
}
unsigned set_n(unsigned x, int pos, int n) {
int i = 0;
int a[99] = { 0 };
for (i = 0; i < int_bits(); i++) {
a[i] = (int)x & 1u;
x >>= 1;
}
for (i = pos; i <= pos + n - 1; i++) {
a[i] = 1;
}
for (i = 0; i < int_bits(); i++) {
x += (unsigned)pow(2, i) * a[i];
}
return x;
}
unsigned reset_n(unsigned x, int pos, int n) {
int i = 0;
int a[99] = { 0 };
for (i = 0; i < int_bits(); i++) {
a[i] = (int)x & 1u;
x >>= 1;
}
for (i = pos; i <= pos + n - 1; i++) {
a[i] = 0;
}
for (i = 0; i < int_bits(); i++) {
x += (unsigned)pow(2, i) * a[i];
}
return x;
}
unsigned inverse_n(unsigned x, int pos, int n) {
int i = 0;
int a[99] = { 0 };
for (i = 0; i < int_bits(); i++) {
a[i] = (int)x & 1u;
x >>= 1;
}
for (i = pos; i <= pos + n - 1; i++) {
if (a[i]) a[i] = 0;
else a[i] = 1;
}
for (i = 0; i < int_bits(); i++) {
x += (unsigned)pow(2, i) * a[i];
}
return x;
}
int main(void) {
unsigned a, b1, b2, b3;
int start, n;
printf("Enter unsigned NUM : "); scanf("%u", &a);
printf("Enter start : "); scanf("%d", &start);
printf("Enter n : "); scanf("%d", &n);
printf("BEFORE : \na = %6u : ", a); print_bits(a);
b1 = set_n(a, start, n);
b2 = reset_n(a, start, n);
b3 = inverse_n(a, start, n);
printf("SET : \nb1 = %6u : ", b1); print_bits(b1);
printf("RESET : \nb2 = %6u : ", b2); print_bits(b2);
printf("INVERSE : \nb3 = %6u : ", b3); print_bits(b3);
return 0;
}