2.60-假设我们将一个w位的字中的字节从0(最低位)到w/8- 1(最高位)编号。写出下面C函数的代码,它会返回一个无符号值,其中参数x的字节i被替换成字节b。

接上题目:

unsigned replace_byte(unsigned x, int i, unsigned char b);

以下示例,说明了这个函数该如何工作:
replace_byte(unsigned x, int i, unsigned char b);

replace_byte(0x12345678, 2, 0xAB)-->0x12AB5678;
replace_byte(0x12345678, 0, 0xAB)-- > 0x123456AB;

开始作答:

/** generate-a-word.c */
#include <stdio.h> 
#include <assert.h> 

//expression: ( (b & 0xFF) << 8 * i ) | ( x&(~ (0xFF << i * 8) ) )
unsigned replace_byte(unsigned x, int i, unsigned char b) {
	unsigned int y = 0;
	//8*i = i<<3  #*************#
	y = (b & 0xFF) << 8 * i;
	x = x&(~(0xFF << i * 8));
	return x|y ;
}

int main() {
	unsigned x = 0x12345678;
	int i = 0;
	unsigned char b = 0xAB;
	printf("%#X\n",replace_byte(x,i,b));
	return 0;
}

官方答案:

#include <stdio.h>
#include <assert.h>

unsigned replace_byte(unsigned x, int i, unsigned char b) {
	if (i < 0) {
		printf("error: i is negetive\n");
		return x;
	}
	if (i > sizeof(unsigned)-1) {
		printf("error: too big i");
		return x;
	}
	
	// 1 byte has 8 bits, << 3 means * 8
	unsigned mask = ((unsigned) 0xFF) << (i << 3);
	unsigned pos_byte = ((unsigned) b) << (i << 3);
	return (x & ~mask) | pos_byte;
}

int main(int argc, char *argv[]) { 
	unsigned rep_0 = replace_byte(0x12345678, 0, 0xAB); 
	unsigned rep_3 = replace_byte(0x12345678, 3, 0xAB); 
	
	assert(rep_0 == 0x123456AB); 
	assert(rep_3 == 0xAB345678); 
	return 0; 
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榆钱不知秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值