【位操作笔记】位合并 普通方式

2024-06-22 04:08

本文主要是介绍【位操作笔记】位合并 普通方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

位合并(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 = 0x7AC30000‭0111 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

这篇关于【位操作笔记】位合并 普通方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083242

相关文章

ShardingSphere之读写分离方式

《ShardingSphere之读写分离方式》:本文主要介绍ShardingSphere之读写分离方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录ShardingSphere-读写分离读写分离mysql主从集群创建 user 表主节点执行见表语句项目代码读写分

Python中合并列表(list)的六种方法小结

《Python中合并列表(list)的六种方法小结》本文主要介绍了Python中合并列表(list)的六种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、直接用 + 合并列表二、用 extend() js方法三、用 zip() 函数交叉合并四、用

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

linux lvm快照的正确mount挂载实现方式

《linuxlvm快照的正确mount挂载实现方式》:本文主要介绍linuxlvm快照的正确mount挂载实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux lvm快照的正确mount挂载1. 检查快照是否正确创建www.chinasem.cn2.

SpringBoot项目Web拦截器使用的多种方式

《SpringBoot项目Web拦截器使用的多种方式》在SpringBoot应用中,Web拦截器(Interceptor)是一种用于在请求处理的不同阶段执行自定义逻辑的机制,下面给大家介绍Sprin... 目录一、实现 HandlerInterceptor 接口1、创建HandlerInterceptor实

查看MySql主从同步的偏移量方式

《查看MySql主从同步的偏移量方式》:本文主要介绍查看MySql主从同步的偏移量方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 1.mysql的主从同步方案mysqlphp为了在实现读写分离,主库写,从库读mysql的同步方案主要是通过从库读取主库的binl

Go语言中使用JWT进行身份验证的几种方式

《Go语言中使用JWT进行身份验证的几种方式》本文主要介绍了Go语言中使用JWT进行身份验证的几种方式,包括dgrijalva/jwt-go、golang-jwt/jwt、lestrrat-go/jw... 目录简介1. github.com/dgrijalva/jwt-go安装:使用示例:解释:2. gi

Linux给磁盘扩容(LVM方式)的方法实现

《Linux给磁盘扩容(LVM方式)的方法实现》本文主要介绍了Linux给磁盘扩容(LVM方式)的方法实现,涵盖PV/VG/LV概念及操作步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录1 概念2 实战2.1 相关基础命令2.2 开始给LVM扩容2.3 总结最近测试性能,在本地打数据时,发现磁盘空

java对接第三方接口的三种实现方式

《java对接第三方接口的三种实现方式》:本文主要介绍java对接第三方接口的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录HttpURLConnection调用方法CloseableHttpClient调用RestTemplate调用总结在日常工作

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设