修改指定数字的指定位

假定整数中的位从右到左进行编号,修改指定数字的指定位

例如:

原始值          需要存储的指             起始位                     结束位                     返回值

0xffff               0x123                                15                             4                              0x123f

函数的功能可以分为以下5步完成

 原始值    需要存储的值   起始位  结束位  返回值
 0xffff    0x123           15       4      0x123f 
 1.创建掩码既需要改变的值得起始位和结束位都为1既 1111 1111 1111 0000 
 2.用掩码的反码对原值进行and操作,原值变为0000 0000 0000 1111
 3.把需要存储的值左移ending_bit的值位 0000 0001 0010 0011  变为  0001 00010 0011 0000
 4.把移位后的值与掩码进行and操作,变为0001 0010 0011 0000
 5.用4的值与原值进行or操作0001 0010 0011 1111 0x123f

代码如下:

 1 #include <stdio.h>
 2 #include <limits.h>
 3 #define INT_BIT (CHAR_BIT*sizeof(int))
 4 int store_bit_field(int original_value,int value_to_store,unsigned starting_bit
 5 ,unsigned ending_bit);
 6 
 7 int main (void)
 8 {
 9     int original_value=0xffff;
10     int value_to_store=0x123;
11     unsigned start=13;
12     unsigned end=9;
13     int result;
14     result=store_bit_field(original_value,value_to_store,start,end);
15     printf("%d\n",result);
16     
17 }
18 int store_bit_field(int original_value,int value_to_store,unsigned starting_bit
19 ,unsigned ending_bit)
20 {
21     /*创建移位的掩码*/
22     unsigned int mask=~0;
23     mask>>=INT_BIT-(starting_bit-ending_bit+1);
24     mask<<=ending_bit;
25     
26     original_value&=~mask;
27     value_to_store<<=ending_bit;
28     value_to_store&=mask; 
29     return original_value|value_to_store;
30     
31 }

 

posted @ 2018-01-09 16:52  快第三个十年  阅读(242)  评论(0编辑  收藏  举报