【明解C语言入门篇】练习7-5个人答案

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值