把一个给定的值存储到一个整数中指定的几个位《C与指针5.8.5》
编写一个函数,把一个给定的值存储到一个整数中指定的几个位。它的原型如下:
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;
}
把一个给定的值存储到一个整数中指定的几个位《C与指针5.8.5》的更多相关文章
- jmeter将上一个接口返回值作为下一个接口的请求参数
在jmeter中有时候会用到,将上一个接口的返回值作为下一个接口的请求参数 具体操作如下: 1.首先新建一个http请求(右键线程组--添加Sampler--http请求),同时添加好接口相应的请求参 ...
- MySQL中设置同一张表中一个字段的值等于另一个字段的值
今天遇到了一个需求,我在一张表中新增了一个字段,因为这张表以前已经有很多数据了,这样对于以前的数据来说,新增的这个字段的值也就是为该字段的默认值,现在需要将新增的这个字段添加上数据,数据来源为同表的另 ...
- 一个短路求值引起的一个小bug
今天在写一个判断字符串是否回文时因为短路求值问题导致了一个bug,记录如下: 代码如下 bool isPal(char str[],int len) { int begin=0; int end=le ...
- 【转载】jmeter将上一个接口返回值作为下一个接口的请求参数
第一:通过JSON Extractor 插件来提取JSON响应结果 原文地址:http://blog.csdn.net/dreamtl/article/details/68957122 接口响应结果, ...
- sqlserver 用一个表的值 更新另一个表
update cas set cas.DocumentHeaderIdOfTransferredForForm = apply.Id from dbo.CaseTransfer cas join db ...
- 数据库-SQL语法:把一个字段的值设为随机整数
update test2 set zuig = (cast ( ceiling (rand()*9) as int))
- SQL 批量修改一个字段的值为另一个字段的值
AND create_time BETWEEN '2016-07-25 14:30:00' AND '2016-07-25 15:20:28'; AND create_time BETWEEN '20 ...
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍
目前的工作是需要对用户的一些数据进行分析,每个用户都有若干条记录,每条记录中有用户的一个位置,是用经度和纬度表示的.还有一个给定的数据库,存储的是一些已知地点以及他们的经纬度,内有43W多条的数据.现 ...
- 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。
给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...
随机推荐
- 欧姆龙PLC CP1E型号的90,91,190
I/O存储区的CIO区,输入位CIO0-CIO99 对于NA型,模拟输入0和1将分别占用CIO90和CIO91 输出位CIO100-CIO199,对于NA型,模拟输出0将占用CIO190
- kafka 常用参数
通常的讲:kafka 的参数分为 Broker Configs 和 Topic-Level Configs,以 min.insync.replicas 为例,可以在 broker 和 topic 级别 ...
- orace如何创建函数并调用
我们来定义一个oracle的函数 create or replace function 方法名(参数名1 参数类型,参数名2 参数类型,参数名3 参数类型)return 返回类型 is num_C n ...
- fetch跨域浏览器请求头待研究
fetch('https://wwww.baidu.com', {headers: { "Access-Control-Allow-Origin": "*", ...
- js将手机号中间四位变成*号
方法一.利用数组splice,split,join方法 var tel = 18810399133; tel = "" + tel; var ary = tel.split(&qu ...
- 开发部署项目时出现:java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: PermGen space 错误: 原文地址:http://www.cnblogs.com/shihujiang/archive/2012/06 ...
- Android 音视频深入 十九 使用ijkplayer做个视频播放器(附源码下载)
项目地址https://github.com/979451341/Myijkplayer 前段时候我觉得FFmpeg做个视频播放器好难,虽然播放上没问题,但暂停还有通过拖动进度条来设置播放进度,这些都 ...
- inout口在modelsim仿真的方法
//主要是// 和**********部分是关键 1 `timescale 1ns/1ns module tb(); reg main_clk; :] addr; reg FPGA_CS0;//FPG ...
- 结队开发之NABCD
我们的产品小工具集合是为了解决办公室办公人员缺少一些快捷操作的痛苦,他们需要在不用登陆QQ或者QQ浏览器的情况下实现截图功能,但是现有的方案并没有很好地解决这些需求,我们有独特的办法,小工具集合中提供 ...
- Visual Studio 2017 离线安装包
vs_community.exe --layout D:vs2017offline-en --add Microsoft.VisualStudio.Workload.ManagedDesktop -- ...