把一个给定的值存储到一个整数中指定的几个位《C与指针5.8.5》
2024-10-13 08:08:20
编写一个函数,把一个给定的值存储到一个整数中指定的几个位。它的原型如下:
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; }
最新文章
- nginx代理TCP端口
- React虚拟DOM浅析
- Android 常用工具类之 DimenUtil
- Effective C++笔记04:设计与声明
- c# winform 引用sqlite.dll 运行报错解决方法
- 脱壳第三讲,UPX压缩壳,以及补充壳知识
- 简单的.editconfig文件
- python使用stomp连接activemq
- 洛谷 K短路(魔法猪学院)
- Python的内置方法——补充
- CXF2.7整合spring发布webservice
- ESP32作为接入点AP
- ngx_lua 模块
- Oracle数据库的入门之一
- excel冻结窗格
- Unity接SDK通用方法总结
- STM32的PWM输入模式设置并用DMA接收数据
- 【转】Android配置文件权限一览表
- IOS中position:fixed吸底时的滑动出现抖动的解决方案
- Executing a system tool
热门文章
- 360开启wifi无网络访问处理办法
- 浏览器如何对HTML5的离线储存资源进行管理和加载
- 二分查找方法和printk打印级别
- c#实现数据库的备份
- 低版本IDE 打开 高版本 IDE 代码时 unit
- grep用法
- 集合练习 练习:每一个学生Student都有一个对应的归属地定义为String类型。学生属性:姓名,年龄 注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。 1、描述学生。 2、定义Map容器,将学生作为键,地址作为值存入集合中。 3、获取Map中的元素并进行排序。
- Linux下数据库备份
- 实例:用户界面控件Kendo UI vs DevExpress对比评测一
- Python元组的一点用法