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

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这个值强制转换为无符号值,然后再对它进行移位。

 #include <stdio.h>

 int store_bit_field(int original_value, int value_to_store,

                     unsigned starting_bit,unsigned ending_bit);

 int main(void)

 {

     printf("%x\n",store_bit_field(0x0,0x1,,));

     printf("%x\n",store_bit_field(0xffff,0x123,,));

     printf("%x\n",store_bit_field(0xffff,0x123,,));

     return ;

 }

 int store_bit_field(int original_value, int value_to_store,

                     unsigned starting_bit,unsigned ending_bit)

 {

     int value;

     int i = ending_bit;

     int unmask = ;

     int mask = ;

     int num = starting_bit - ending_bit + ;

     while(num != ){

         mask <<= ;

         mask |= ;

         num--;

     }

     while(i != ){

         i--;

         mask <<= ;

     }

     unmask = ~mask;

     original_value &= unmask;

     i = ending_bit;

     while(i != ){

         i--;

         value_to_store <<= ;

     }

     value = value_to_store & mask;

     value |= original_value;

     return value;

 }

最新文章

  1. nginx代理TCP端口
  2. React虚拟DOM浅析
  3. Android 常用工具类之 DimenUtil
  4. Effective C++笔记04:设计与声明
  5. c# winform 引用sqlite.dll 运行报错解决方法
  6. 脱壳第三讲,UPX压缩壳,以及补充壳知识
  7. 简单的.editconfig文件
  8. python使用stomp连接activemq
  9. 洛谷 K短路(魔法猪学院)
  10. Python的内置方法——补充
  11. CXF2.7整合spring发布webservice
  12. ESP32作为接入点AP
  13. ngx_lua 模块
  14. Oracle数据库的入门之一
  15. excel冻结窗格
  16. Unity接SDK通用方法总结
  17. STM32的PWM输入模式设置并用DMA接收数据
  18. 【转】Android配置文件权限一览表
  19. IOS中position:fixed吸底时的滑动出现抖动的解决方案
  20. Executing a system tool

热门文章

  1. 360开启wifi无网络访问处理办法
  2. 浏览器如何对HTML5的离线储存资源进行管理和加载
  3. 二分查找方法和printk打印级别
  4. c#实现数据库的备份
  5. 低版本IDE 打开 高版本 IDE 代码时 unit
  6. grep用法
  7. 集合练习 练习:每一个学生Student都有一个对应的归属地定义为String类型。学生属性:姓名,年龄 注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。 1、描述学生。 2、定义Map容器,将学生作为键,地址作为值存入集合中。 3、获取Map中的元素并进行排序。
  8. Linux下数据库备份
  9. 实例:用户界面控件Kendo UI vs DevExpress对比评测一
  10. Python元组的一点用法