C和指针课后练习第五章

本文介绍了五个C语言编程练习,涉及字符处理和位操作。包括将大写字母转换为小写,实现Caesar密码加密,进行二进制位逆置,设计位数组函数以及在整数中定位存储值的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.从标准输入读取字符并输出,大写字母字符转小写字母字符,其他字符不变

// 将大写字母转换为小写字母
char ToUp(char ch) {
	if (ch < 'A' || ch > 'Z') {		// 不在A~Z之间的字符直接输出
		return ch;
	}
	char a = 'a';
	return ch + 32;
}

2.从标准输入读取字符并输出,非字母字符直接输出,字母字符输出时加密,加密规则:每个字母被修改为在字母表上距其13个位置(前或后)的字母

// 字母加密
char Encryption(char ch) {
	if ((ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z')) {	// 不在a~z和A~Z之间的字符直接输出
		return ch;
	}
	if (ch < ('A' + 13) || (ch >= 'a' && ch < ('a' + 13))) { // ch在[A,M]和[a,m]之间加13
		return ch + 13;
	}
	return ch - 13;
}

3.编写函数unsigned int reverse_bit(unsigned int value),实现二进制位逆置

// 无符号数比特位的逆置
unsigned int reverse_bit(unsigned int value) {
	int total_bits = sizeof(unsigned int) * 8;	//总共有多少位
	int val_reverse = 0;
	// 将value的每一个二进制位从低到高提取出来
	for (int bit = 0; bit < total_bits; ++bit, value /= 2) {
		// 再将每一位乘2相加
		val_reverse = val_reverse * 2 + (value % 2);
	}
	return val_reverse;
}

4.编写一组函数,实现位数组

// 将指定位置置1
void set_bit(char bit_array[], unsigned int bit_number) {
	// 将该位在数组上的那个元素找到在去置这个元素的某位
	bit_array[bit_number / 8] |= (1 << (bit_number % 8));
}

// 将指定位清零
void clear_bit(char bit_array[], unsigned int bit_number) {
	// 将该位在数组上的那个元素找到在去清零这个元素的某位
	bit_array[bit_number / 8] &= ~(1 << (bit_number % 8));
}

// 如果value = 0,将指定位清零,否则置1
void assign_bit(char bit_array[], unsigned int bit_number, int value) {
	// 加上判断调用之前的两个函数
	if (value) {
		set_bit(bit_array, bit_number);
	}
	else {
		clear_bit(bit_array, bit_number);
	}
}

// 如果参数中指定的位不是0,函数返回真,否则返回假
int test_bit(char bit_array[], unsigned int bit_number) {
	// 将该位在数组上的那个元素,该元素的需判断的那一位与1或,再与原值相比较
	// 相同该位为1,不同该位为0
	return bit_array[bit_number / 8] == (bit_array[bit_number / 8] | (1 << (bit_number % 8)));
}

5.编写一个函数,把一个给定的值存储到一个整数中指定的几个位

// 把value_to_store存储到original_value中[starting_bit,ending_bit]位置
int store_bit_field(int original_value, int value_to_store,
	unsigned int starting_bit, unsigned int ending_bit) {
	// 1.掩码
	unsigned int mask = 0;
	for (int i = ending_bit; i <= starting_bit; ++i) {
		mask |= 1 << i;
	}
	// 2.掩码的反码对源值执行位AND
	original_value &= ~mask;
	// 3.新值左移,与需要存储的位对齐
	value_to_store <<= ending_bit;
	// 4.移位后的值与掩码进行位AND
	value_to_store &= mask;
	// 5.结果与原值进行位OR操作
	return original_value | value_to_store;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值