把一个给定的值存储到一个整数中指定的几个位《C与指针5.8.5》

编写一个函数,把一个给定的值存储到一个整数中指定的几个位。它的原型如下:

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
",store_bit_field(0x0,0x1,4,4));
16 
17     printf("%x
",store_bit_field(0xffff,0x123,15,4));
18 
19     printf("%x
",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 }
原文地址:https://www.cnblogs.com/myohao/p/8497174.html