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