本文主要是介绍【位操作笔记】位合并 普通方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
位合并(Merge bits) 普通方式
通过掩码把两个数进行位合并。例如一个数为0x23,另一个数为0x65,假设合并的数要取第一个数的高4位,第二个数的低4位,那么合并后的数就是0x25。
算法说明
该算法通过先与掩码,再进行或操作完成。
实现代码
non_masked_val和masked_val是两个要进行合并的数,mask是掩码。
non_masked_val是合并非掩码位,masked_val是合并掩码位。
实现方式为:
unsigned int Merge_bits(unsigned int non_masked_val, unsigned int masked_val, unsigned int mask)
{return (non_masked_val & ~mask) | (masked_val & mask);
}
算法计算过程
第一步,~mask 。
掩码取反。
第二步,non_masked_val & ~mask。
mask的取反值与non_masked_val 进行与操作,留下非掩码位的值。
第三步, masked_val & mask。
masked_val与mask进行与操作,留下掩码位的值。
第四步,(non_masked_val & ~mask) | (masked_val & mask)
第二步和第三步的值进行或操作完成合并。
计算示例
例如:
non_masked_val = 0x7AC34B64
masked_val = 0x98BF537A
mask = 0x0000FFFF
第一步
~mask = ~0x0000FFFF = 0xFFFF0000~ 0000 0000 0000 0000 1111 1111 1111 1111
-------------------------------------------1111 1111 1111 1111 0000 0000 0000 0000
第二步
non_masked_val & ~mask
0x7AC34B64 & 0xFFFF0000 = 0x7AC300000111 1010 1100 0011 0100 1011 0110 0100
& 1111 1111 1111 1111 0000 0000 0000 0000
-------------------------------------------0111 1010 1100 0011 0000 0000 0000 0000
第三步
masked_val & mask
0x98BF537A & 0x0000FFFF = 0x0000537A1001 1000 1011 1111 0101 0011 0111 1010
& 0000 0000 0000 0000 1111 1111 1111 1111
-------------------------------------------0000 0000 0000 0000 0101 0011 0111 1010
第四步
0x7AC30000 & 0x0000537A = 0x7AC3537A0111 1010 1100 0011 0000 0000 0000 0000
| 0000 0000 0000 0000 0101 0011 0111 1010
-------------------------------------------0111 1010 1100 0011 0101 0011 0111 1010
得到两个数合并的数0x7AC3537A。
[参考资料]
Bit Twiddling Hacks By Sean Eron Anderson
本文链接:https://blog.csdn.net/u012028275/article/details/117400008
这篇关于【位操作笔记】位合并 普通方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!