user-0 提问: c和指针一书中的问题

回复:
user: user-1
content: 引用 14 楼 DKtion 的回复:[quote=引用 13 楼 user-1 的回复:] [quote=引用 12 楼 DKtion 的回复:] [quote=引用 7 楼 user-1 的回复:]  unsigned int create_mask(int starting_bit, int ending_bit) { 	unsigned int mask = 0; 	int i; 	for (i = starting_bit; i != ending_bit - 1; --i) 	{ 		mask |= 1 << i; 	} 	return mask; }  int store_bit_field(int original_value, int value_to_store, unsigned starting_bit, unsigned ending_bit) { 	// step1: 创建掩码 	unsigned int mask = create_mask(starting_bit, ending_bit); 	// step2: 清空origin_value对应的位 	original_value &= ~mask; 	// step3&4: 移动value_to_store到对应的位并清空没用的位 	value_to_store = value_to_store << ending_bit & mask; 	// step5:返回结果 	return original_value | value_to_store; } #include <stdio.h> int main() { 	printf("%#x", store_bit_field(0xffff, 0x123, 13, 9)); 	return 0; }  运行结果0xc7ff    我擦  原来书上的原码111111111就是original啊   我还是看不懂你创建掩码的方法，每次掩码与1相与后就往左移位，到下次移位时，不是整体往左移吗？那么每次往左移位后的1就不是相邻的了吧...[/quote] 你是先取反，然后把多余的1移掉。 我是最初为全0，然后把1一个个扔进去[/quote]    你在扔进去一个1后，然后就把他左移了，那下一个与1相与后的1不就与上一次的1不相邻了吗？[/quote] mask没有左移，左移的是1，每次循环左移的1左移位数不同，mask只管与新移好的1相或即可

user: user-0
content: 引用 13 楼 user-1 的回复:[quote=引用 12 楼 DKtion 的回复:] [quote=引用 7 楼 user-1 的回复:]  unsigned int create_mask(int starting_bit, int ending_bit) { 	unsigned int mask = 0; 	int i; 	for (i = starting_bit; i != ending_bit - 1; --i) 	{ 		mask |= 1 << i; 	} 	return mask; }  int store_bit_field(int original_value, int value_to_store, unsigned starting_bit, unsigned ending_bit) { 	// step1: 创建掩码 	unsigned int mask = create_mask(starting_bit, ending_bit); 	// step2: 清空origin_value对应的位 	original_value &= ~mask; 	// step3&4: 移动value_to_store到对应的位并清空没用的位 	value_to_store = value_to_store << ending_bit & mask; 	// step5:返回结果 	return original_value | value_to_store; } #include <stdio.h> int main() { 	printf("%#x", store_bit_field(0xffff, 0x123, 13, 9)); 	return 0; }  运行结果0xc7ff    我擦  原来书上的原码111111111就是original啊   我还是看不懂你创建掩码的方法，每次掩码与1相与后就往左移位，到下次移位时，不是整体往左移吗？那么每次往左移位后的1就不是相邻的了吧...[/quote] 你是先取反，然后把多余的1移掉。 我是最初为全0，然后把1一个个扔进去[/quote]    你在扔进去一个1后，然后就把他左移了，那下一个与1相与后的1不就与上一次的1不相邻了吗？

user: user-1
content: 引用 12 楼 DKtion 的回复:[quote=引用 7 楼 user-1 的回复:]  unsigned int create_mask(int starting_bit, int ending_bit) { 	unsigned int mask = 0; 	int i; 	for (i = starting_bit; i != ending_bit - 1; --i) 	{ 		mask |= 1 << i; 	} 	return mask; }  int store_bit_field(int original_value, int value_to_store, unsigned starting_bit, unsigned ending_bit) { 	// step1: 创建掩码 	unsigned int mask = create_mask(starting_bit, ending_bit); 	// step2: 清空origin_value对应的位 	original_value &= ~mask; 	// step3&4: 移动value_to_store到对应的位并清空没用的位 	value_to_store = value_to_store << ending_bit & mask; 	// step5:返回结果 	return original_value | value_to_store; } #include <stdio.h> int main() { 	printf("%#x", store_bit_field(0xffff, 0x123, 13, 9)); 	return 0; }  运行结果0xc7ff    我擦  原来书上的原码111111111就是original啊   我还是看不懂你创建掩码的方法，每次掩码与1相与后就往左移位，到下次移位时，不是整体往左移吗？那么每次往左移位后的1就不是相邻的了吧...[/quote] 你是先取反，然后把多余的1移掉。 我是最初为全0，然后把1一个个扔进去

user: user-0
content: 引用 7 楼 user-1 的回复: unsigned int create_mask(int starting_bit, int ending_bit) { 	unsigned int mask = 0; 	int i; 	for (i = starting_bit; i != ending_bit - 1; --i) 	{ 		mask |= 1 << i; 	} 	return mask; }  int store_bit_field(int original_value, int value_to_store, unsigned starting_bit, unsigned ending_bit) { 	// step1: 创建掩码 	unsigned int mask = create_mask(starting_bit, ending_bit); 	// step2: 清空origin_value对应的位 	original_value &= ~mask; 	// step3&4: 移动value_to_store到对应的位并清空没用的位 	value_to_store = value_to_store << ending_bit & mask; 	// step5:返回结果 	return original_value | value_to_store; } #include <stdio.h> int main() { 	printf("%#x", store_bit_field(0xffff, 0x123, 13, 9)); 	return 0; }  运行结果0xc7ff    我擦  原来书上的原码111111111就是original啊   我还是看不懂你创建掩码的方法，每次掩码与1相与后就往左移位，到下次移位时，不是整体往左移吗？那么每次往左移位后的1就不是相邻的了吧...

user: user-1
content: 调试程序一步步地调，每一步后面都输出相关的值，用十六进制输出，自己化成二进制与预期的对比，如果错误，则专注于这一步的问题，正确后再看下一步

user: user-0
content: 引用 7 楼 user-1 的回复: unsigned int create_mask(int starting_bit, int ending_bit) { 	unsigned int mask = 0; 	int i; 	for (i = starting_bit; i != ending_bit - 1; --i) 	{ 		mask |= 1 << i; 	} 	return mask; }  int store_bit_field(int original_value, int value_to_store, unsigned starting_bit, unsigned ending_bit) { 	// step1: 创建掩码 	unsigned int mask = create_mask(starting_bit, ending_bit); 	// step2: 清空origin_value对应的位 	original_value &= ~mask; 	// step3&4: 移动value_to_store到对应的位并清空没用的位 	value_to_store = value_to_store << ending_bit & mask; 	// step5:返回结果 	return original_value | value_to_store; } #include <stdio.h> int main() { 	printf("%#x", store_bit_field(0xffff, 0x123, 13, 9)); 	return 0; }  运行结果0xc7ff    呀  这代码  我得慢慢看才看得懂

user: user-0
content: 引用 6 楼 DKtion 的回复:[quote=引用 4 楼 user-1 的回复:] 第2步错了，也就是original value对应的位没清空 还有你改变了掩码的值，导致第4步也错了 ？？？怎么没清空？？[/quote] int store_bit_filed(int original_value, int value_to_store, unsigned staring_bit, unsigned ending_bit) { 	unsigned int mask; 	mask = (unsigned)(~0); 	mask >>=staring_bit; 	mask <<= (32-ending_bit+ending_bit);//创建掩码 	mask >>= ending_bit; 	mask = (unsigned)(~0) & ~mask;//掩码的反码对原值执行AND 	value_to_store <<= staring_bit;//新值左移，进行对齐 	value_to_store = value_to_store & mask;//移位后的新值与掩码AND 	value_to_store = value_to_store | (~0);//结果值与原码OR 	return value_to_store; }   改成这样？？还是有点问题..

user: user-1
content: 你第5步也错了，没有与原值相或，只有第1步创建掩码是对的，参考一下我7楼的代码吧

user: user-1
content: unsigned int create_mask(int starting_bit, int ending_bit) { 	unsigned int mask = 0; 	int i; 	for (i = starting_bit; i != ending_bit - 1; --i) 	{ 		mask |= 1 << i; 	} 	return mask; }  int store_bit_field(int original_value, int value_to_store, unsigned starting_bit, unsigned ending_bit) { 	// step1: 创建掩码 	unsigned int mask = create_mask(starting_bit, ending_bit); 	// step2: 清空origin_value对应的位 	original_value &= ~mask; 	// step3&4: 移动value_to_store到对应的位并清空没用的位 	value_to_store = value_to_store << ending_bit & mask; 	// step5:返回结果 	return original_value | value_to_store; } #include <stdio.h> int main() { 	printf("%#x", store_bit_field(0xffff, 0x123, 13, 9)); 	return 0; }  运行结果0xc7ff

user: user-0
content: 引用 4 楼 user-1 的回复:第2步错了，也就是original value对应的位没清空 还有你改变了掩码的值，导致第4步也错了 ？？？怎么没清空？？

user: user-1
content: 还有第3步你也错了，是左移不是右移

user: user-1
content: 第2步错了，也就是original value对应的位没清空 还有你改变了掩码的值，导致第4步也错了

user: user-0
content: 其实有点看不懂这题目

user: user-0
content: 在VS2015编译环境下写的程序

user: user-0
content: 这是题目