假定整数中的位从右到左进行编号,修改指定数字的指定位
例如:
原始值 需要存储的指 起始位 结束位 返回值
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 ",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 }