#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(unsigned x, int pos) {
if (((x >> pos) & 1u) == 0) x += (unsigned)pow(2, pos); /*运算符的优先级请注意*/
return x;
}
unsigned reset(unsigned x, int pos) {
if (((x >> pos) & 1u) == 1) x -= (unsigned)pow(2, pos);
return x;
}
unsigned inverse(unsigned x, int pos) {
if (((x >> pos) & 1u) == 1) x -= (unsigned)pow(2, pos);
else x += (unsigned)pow(2, pos);
}
int main(void) {
unsigned a[10] = { 2 };
int i = 0;
puts("请输入无符号整数:"); scanf("%u", &a[0]);
puts("请输入更改位数:"); scanf("%d", &i);
printf("%u内部表示为:\n", a[0]); print_bits(a[0]);
putchar('\n');
a[1] = set(a[0], i);
printf("第%d位更改为1,结果是:%u\n", i, a[1]);
printf("新数字内部表示为:\n"); print_bits(a[1]);
putchar('\n');
a[2] = reset(a[0], i);
printf("第%d位更改为0,结果是:%u\n", i, a[2]);
printf("新数字内部表示为:\n"); print_bits(a[2]);
putchar('\n');
a[3] = inverse(a[0], i);
printf("第%d位相反,结果是:%u\n", i, a[3]);
printf("新数字内部表示为:\n"); print_bits(a[3]);
putchar('\n');
return 0;
}