编写一个函数,把一个给定的值存储到一个整数中指定的几个位。它的原型如下:
int store_bit_field(int original_value, int value_to_store,
unsigned starting_bit, unsigned ending_bit);
假定整数中的位是从右向左进行编号。因此,起始位的位置不会小于结束位的位置,为了更清楚的说明,函数应该返回下列值。
原始值 | 需要储存的位 | 起始位 | 结束位 | 返回值 |
0x0 | 0x1 | 4 | 4 | 0x10 |
0xffff | 0x123 | 15 | 4 | 0x123f |
0xffff | 0x123 | 13 | 9 | 0xc7ff |
提示:把一个值存储到一个整数中指定的几个位分为5个步骤,以上表最后一行为例:
1).创建一个掩码,它是一个值,其中需要存储的位置相对应的那几个位设置为1,此时掩码为
00111110,00000000
2).用掩码的反码对原值执行AND操作,将那几个位设置为0.原值1111111111111111,操作后变为
11000001,11111111
3).将新值左移,使它与需要存储的位对齐,新值00000001,00100011(0x123),左移后变为
01000110,00000000
4).把移位后的值与掩码进行位AND操作,确保除那几个需要存储的位之外的其余位都设置为0,进行这个操作之后,值变为
00000110,00000000
5).把结果值与原值进行位OR操作,结果为(0xc7ff)
11000111,11111111
在所有任务中,最困难的是创建掩码,你一开始可以把~0这个值强制转换为无符号值,然后再对它进行移位。
#include <stdio.h> int store_bit_field(int original_value, int value_to_store, unsigned starting_bit,unsigned ending_bit); int main(void) { printf("%x\n",store_bit_field(0x0,0x1,,)); printf("%x\n",store_bit_field(0xffff,0x123,,)); printf("%x\n",store_bit_field(0xffff,0x123,,)); return ; } int store_bit_field(int original_value, int value_to_store, unsigned starting_bit,unsigned ending_bit) { int value; int i = ending_bit; int unmask = ; int mask = ; int num = starting_bit - ending_bit + ; while(num != ){ mask <<= ; mask |= ; num--; } while(i != ){ i--; mask <<= ; } unmask = ~mask; original_value &= unmask; i = ending_bit; while(i != ){ i--; value_to_store <<= ; } value = value_to_store & mask; value |= original_value; return value; }