编写一个函数,把一个给定的值存储到一个整数中指定的几个位。它的原型如下:
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这个值强制转换为无符号值,然后再对它进行移位。
1 #include <stdio.h> 2 3 4 5 int store_bit_field(int original_value, int value_to_store, 6 7 unsigned starting_bit,unsigned ending_bit); 8 9 10 11 int main(void) 12 13 { 14 15 printf("%x\n",store_bit_field(0x0,0x1,4,4)); 16 17 printf("%x\n",store_bit_field(0xffff,0x123,15,4)); 18 19 printf("%x\n",store_bit_field(0xffff,0x123,13,9)); 20 21 return 0; 22 23 } 24 25 26 27 int store_bit_field(int original_value, int value_to_store, 28 29 unsigned starting_bit,unsigned ending_bit) 30 31 { 32 33 int value; 34 35 int i = ending_bit; 36 37 int unmask = 0; 38 39 int mask = 0; 40 41 int num = starting_bit - ending_bit + 1; 42 43 while(num != 0){ 44 45 mask <<= 1; 46 47 mask |= 1; 48 49 num--; 50 51 } 52 53 while(i != 0){ 54 55 i--; 56 57 mask <<= 1; 58 59 } 60 61 62 63 unmask = ~mask; 64 65 original_value &= unmask; 66 67 68 69 i = ending_bit; 70 71 while(i != 0){ 72 73 i--; 74 75 value_to_store <<= 1; 76 77 } 78 79 80 81 value = value_to_store & mask; 82 83 84 85 value |= original_value; 86 87 return value; 88 89 }