把一个给定的值存储到另一个整数中指定的几位
2012-09-24 14:43
239 查看
编写一个函数,把一个给定的值存储到另一个整数中指定的几位,它的原型如下:
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:创建一个掩码(mask),它是一个值,其中需要存储的位置相对应的那几个位置为1。此时掩码为001111100000000.
2:用掩码的反码对原值进行and操作,将那几个位置设置为0.原值111111111111111(0xffff),操作后变为110000011111111.
3:将新值左移,是它与那几个需要存储的位对齐。新值0000000100100011(0x123),左移后变为0100011000000000.
4:吧以为后的值与掩码进行and操作,确保除那几个需要存储的为之外的其余位都设置为0.进行这个操作后,值变为000001100000000.
5把结果值与原值进行or操作,结果为11000111111111(0xc7ff),也就是最终的返回值
C代码:
typedef unsigned int u_int;
u_int get_mask(int begin,int end)
{
/*
u_int index = 1u;
int n = 0;
//计算出机器字长n
for(index = 1; index != 0; index <<= 1)
{
n++;
}
printf("机器字长:%d",n);
*/
//要设置的位数
int len = end - begin;
//取得掩码
u_int mask = 2u;
for(int i = 0; i < len; i++)
{
mask |= 1;
mask <<= 1;
}
mask <<= begin - 1;
return mask;
}
int store_bit_field(int original_value,int value_to_store,unsigned starting_bit,unsigned ending_bit)
{
u_int mask = get_mask(starting_bit,ending_bit);
original_value &= ~mask;
value_to_store <<= starting_bit;
value_to_store &= mask;
return value_to_store | original_value;
}
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:创建一个掩码(mask),它是一个值,其中需要存储的位置相对应的那几个位置为1。此时掩码为001111100000000.
2:用掩码的反码对原值进行and操作,将那几个位置设置为0.原值111111111111111(0xffff),操作后变为110000011111111.
3:将新值左移,是它与那几个需要存储的位对齐。新值0000000100100011(0x123),左移后变为0100011000000000.
4:吧以为后的值与掩码进行and操作,确保除那几个需要存储的为之外的其余位都设置为0.进行这个操作后,值变为000001100000000.
5把结果值与原值进行or操作,结果为11000111111111(0xc7ff),也就是最终的返回值
C代码:
typedef unsigned int u_int;
u_int get_mask(int begin,int end)
{
/*
u_int index = 1u;
int n = 0;
//计算出机器字长n
for(index = 1; index != 0; index <<= 1)
{
n++;
}
printf("机器字长:%d",n);
*/
//要设置的位数
int len = end - begin;
//取得掩码
u_int mask = 2u;
for(int i = 0; i < len; i++)
{
mask |= 1;
mask <<= 1;
}
mask <<= begin - 1;
return mask;
}
int store_bit_field(int original_value,int value_to_store,unsigned starting_bit,unsigned ending_bit)
{
u_int mask = get_mask(starting_bit,ending_bit);
original_value &= ~mask;
value_to_store <<= starting_bit;
value_to_store &= mask;
return value_to_store | original_value;
}
相关文章推荐
- 把一个给定的值存储到一个整数中指定的几个位《C与指针5.8.5》
- 把一个给定的值存储到一个整数中指定的几个位
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)
- 题目1.请给出一个运行时间为O(nlgn)的算法,使之能在给定一个由n个整数构成的集合S和另一个证书x时,判断出S中是否存在有两个其和等于x的元素。
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(1)
- 2.3-7 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)
- 9.10扩展性与存储限制(二)——给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 扩展性与存储限制(二)——给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- leetcode-java.T001_TwoSum 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字
- 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 5.5编写一个程序,把一个指定的值存储到一个整数中指定的几个位。它的原型如下
- 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素