n位段高x低n-x位的存储与分组(移位 逻辑运算符的妙用)
来源:互联网 发布:一个淘宝网站值多少钱 编辑:程序博客网 时间:2024/06/06 05:39
“通用”的外表是神奇的,“通用”的内心是神秘的。
1 最高x 最低n-x位内存的存储
(1) 问题
假设某系统(如STM32芯片)的某特殊n bit内存块(如某寄存器),最高x(x属于[0, n])bit保存最大为Lmax的男生数量,最低y(y = n - x)bit用来保存最大为Mmax的女生数量。当确定了男女生的最大数Lmax,Mmax时,如何将男生数量L(L属于[0, Lmax])和女生数量M(M属于[0, Mmax])准确的保存在这n bit中?这种情况在配置寄存器中常见,如配置中断优先级相关的寄存器时。
(2) 分析
在二进制系统中,所有的数据都是以二进制的形式存在。每一个数在内存中都对应着一个二进制码。对于熟悉10进制的我们常念叨的男女最大数Lmax,Mmax,分别对应二进制系统中的男生数能够占用的最大内存bit数Lbmax,女生能够占用的最大内存bit数Mbmax。如当n = 4时,Lmax = 1,Mmax = 7时,对应的Lbmax = 1,Mbmax = 3。(3) 例子
在以上问题中,现有n = 4,则这n bit内存能够表示的数的范围为[0, 15]。Human所规定的Lmax,Mmax(Lmax + Mmax= 15)对应着Lmax,Mmax在内存中能够占的最大位数Lbmax,Mbmax情况如下,Lmax
Mmax
Lbmax
Mbmax
0
15
0
4
1
7
1
3
4
4
2
2
7
1
3
1
15
0
4
0
现在要实现在告知Mbmax的情况下,就能够将L(L是男生数),M(M是女生数)准确的将L,M保存在这4bit中的准确位置中。
[1] 用Mbmax来移除L不应在4 bit中的位。
[2] 用Mbmax来保留M只该被保留的位。uint_32 tmp = 0x00;tmp= L << Mbmax;tmp|= M & Mmax;weekend= tmp << 28;
1~3. L和M为给定的男女数,若L和M分别在[0, Lmax]和[0, Mmax]中即L和M没有超过在内存中应占的最大位数时,L和M值被正确地保存在tmp的bit[4:0]的最高Lbmax,最低Mbmax位中。若L或M不在以上范围之内,则最高Lbmax及最低Mbmax位中保存的都是1即保存的是Lmax和Mmax。
4. 若weekend寄存器的bit[31:28]位需要如此的配置,则将tmp移位到左移28位赋值给weekend时就能够达目标。2 分组
(1) 问题
现有[0, L]这样一组正整数。每m个分为一组,即[0, m -1]为第0组,[m, 2m -1]为第1组……对于得到的每一个组,从第一个元素开始编号为0, 1, …, m – 1。n >= 2m – 1,m为大于0的正整数。
[1] 元素x(x属于[0, L])在哪一个组?
[2] 元素x的编号?
(2) 分析
[1] 元素x属于 |_ x / m _|组。|_ x / m _|为x除以m的商。
[2] 元素x的编号为x % m(x除以m的余数)。特殊的,当m为2^k(k = 0, 1, 2…)时,考虑第y(y属于[2, |_ L / m _| + 1])组的元素数与(y – 1)组的元数在内存中的存储的区别:同编号的元素的最低k bit相同,第y组元素的第(k + 1)bit为1,第(y - 1)组元素的第(k + 1)bit为0。第一组元素即为编号。这就是说,此时要求的x的编号就是x & (2^k– 1)。
(3) 例子
针对于以上问题,L = 67,m = 32时。因为m = 2^5,所以可以用求取编号时可以用第二种方法('/',‘%’运算符的代价较大,在程序大部分时间花在这些语句上时,用与运算符'&'来代替求余运算符就提高了代码运行效率 ---- 代码优化)。那么任意一个属于[0, 67]的x的组数和下标可用一下语句求得,//x所在的组数group= x >> 0x05;//x的编号index= x & 0x1f;
- n位段高x低n-x位的存储与分组(移位 逻辑运算符的妙用)
- 位运算n & (n-1)的妙用
- 位运算n & (n-1)的妙用
- n&(n-1)的妙用(强大的位运算)
- Pow(x,n) x的n次方
- x的n次方
- x的n次方
- X的n次方
- x的n次方求解 与 优化
- Leetcode的Pow(x, n) 与 sqrt(x)
- n&(n-1)的妙用
- n&(n-1)的妙用
- n&(n-1)的妙用
- n&(n-1)的妙用
- n&(n-1)的妙用
- n&(n-1)的妙用
- n & (n-1) 的妙用
- n&(n-1)的妙用
- XML基础
- web项目开发流程经验总结
- CString+nChar的问题
- 有源晶振和无源晶振的区别
- USACO打怪升级(一):What is USACO?
- n位段高x低n-x位的存储与分组(移位 逻辑运算符的妙用)
- 8*8全彩点阵的使用
- 缩放图片
- c函数之【进程及流程控制】
- Fence Repair
- myFirstApp android app
- 离散化 anoi2005穿越磁场 bzoj1967
- JAVA过滤html标签的方法
- 校赛B 长单词