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

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

相关文章

如何突破底层思维方式的牢笼

我始终认为,牛人和普通人的根本区别在于思维方式的不同,而非知识多少、阅历多少。 在这个世界上总有一帮神一样的人物存在。就像读到的那句话:“人类就像是一条历史长河中的鱼,只有某几条鱼跳出河面,看到世界的法则,但是却无法改变,当那几条鱼中有跳上岸,进化了,改变河道流向,那样才能改变法则。”  最近一段时间一直在不断寻在内心的东西,同时也在不断的去反省和否定自己的一些思维模式,尝试重

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

idea lanyu方式激活

访问http://idea.lanyus.com/这个地址。根据提示将0.0.0.0 account.jetbrains.com添加到hosts文件中,hosts文件在C:\Windows\System32\drivers\etc目录下。点击获得注册码即可。

mysql索引一(普通索引)

mysql的索引分为两大类,聚簇索引、非聚簇索引。聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引则不同。聚簇索引能够提高多行检索的速度、非聚簇索引则对单行检索的速度很快。         在这两大类的索引类型下,还可以降索引分为4个小类型:         1,普通索引:最基本的索引,没有任何限制,是我们经常使用到的索引。         2,唯一索引:与普通索引

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

以canvas方式绘制粒子背景效果,感觉还可以

这个是看到项目中别人写好的,感觉这种写法效果还可以,就存留记录下 就是这种的背景效果。如果想改背景颜色可以通过canvas.js文件中的fillStyle值改。 附上demo下载地址。 https://download.csdn.net/download/u012138137/11249872

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

vue子路由回退后刷新页面方式

最近碰到一个小问题,页面中含有 <transition name="router-slid" mode="out-in"><router-view></router-view></transition> 作为子页面加载显示的地方。但是一般正常子路由通过 this.$router.go(-1) 返回到上一层原先的页面中。通过路由历史返回方式原本父页面想更新数据在created 跟mounted

操作系统实训复习笔记(1)

目录 Linux vi/vim编辑器(简单) (1)vi/vim基本用法。 (2)vi/vim基础操作。 进程基础操作(简单) (1)fork()函数。 写文件系统函数(中等) ​编辑 (1)C语言读取文件。 (2)C语言写入文件。 1、write()函数。  读文件系统函数(简单) (1)read()函数。 作者本人的操作系统实训复习笔记 Linux