本文主要是介绍【位操作笔记】位合并 通过掩码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
位合并(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 ^ ((non_masked_val ^ masked_val) & mask);
}
普通的实现方式为:
unsigned int Merge_bits(unsigned int non_masked_val, unsigned int masked_val, unsigned int mask)
{return (non_masked_val & ~mask) | (masked_val & mask);
}
算法计算过程
第一步,non_masked_val ^ masked_val。
两个数异或,bit位数值不同的bit位会置位。
第二步,& mask。
与mask,保留下既是两个数数值不同的位,又是掩码位的位。
第三步, ^ non_masked_val
异或需要合并非掩码位的数,会得到合并的数。
因为一个数异或两次相同的值,会得到原本的值,masked_val在第一步先与non_masked_val 异或了一次,然后通过mask去除不需要的位,然后第三步再进行异或,就会只留下masked_val在掩码位的值。
计算示例
例如:
non_masked_val = 0x7AC34B64
masked_val = 0x98BF537A
mask = 0x0000FFFF
第一步
0x7AC34B64 ^ 0x98BF537A = 0xE27C181E0111 1010 1100 0011 0100 1011 0110 0100
^ 1001 1000 1011 1111 0101 0011 0111 1010
-------------------------------------------1110 0010 0111 1100 0001 1000 0001 1110
第二步
0xE27C181E ^ 0x0000FFFF = 0xE27CE7E11110 0010 0111 1100 0001 1000 0001 1110
& 0000 0000 0000 0000 1111 1111 1111 1111
-------------------------------------------0000 0000 0000 0000 0001 1000 0001 1110
第三步
0xE27CE7E1 ^ 0x7AC34B64 = 0x7AC3537A0000 0000 0000 0000 0001 1000 0001 1110
^ 0111 1010 1100 0011 0100 1011 0110 0100
-------------------------------------------0111 1010 1100 0011 0101 0011 0111 1010
得到两个数合并的数0x7AC3537A。
[参考资料]
Bit Twiddling Hacks By Sean Eron Anderson
本文链接:https://blog.csdn.net/u012028275/article/details/117400114
这篇关于【位操作笔记】位合并 通过掩码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!