当前位置:网站首页>位级运算之提取位级表示的最高位
位级运算之提取位级表示的最高位
2022-08-03 13:34:00 【Once_day】
位级运算之提取位级表示的最高位
Author:Once day Date:2022年7月31日
漫漫长路刚刚开始,不要甘于平凡。
本算法基于C语言环境。
1.引言
可以只依靠基本的位级运算来提取位级表示的最高位。
如值0xFF00,返回0x8000,值0x6600,返回0x4000。
简单的处理是从最高位向右依次判断,不过存在一种无需判断,且复杂度为对数级别的方法。
2.实现
假设一共32位,即0x00707000,看成32位的向量 b 31 b n 30 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ b 1 b 0 b_{31}bn_{30}······b_1b_0 b31bn30⋅⋅⋅⋅⋅⋅b1b0。
那么可以将其分成两部分,利用折半查找的思想,即 u 1 = b 31 b 30 ⋅ ⋅ ⋅ b 17 b 16 u_1=b_{31}b_{30}···b_{17}b_{16} u1=b31b30⋅⋅⋅b17b16和 u 2 = b 15 b 14 ⋅ ⋅ ⋅ b 1 b 0 u_2=b_{15}b_{14}···b_{1}b_{0} u2=b15b14⋅⋅⋅b1b0。
直接进行与运算,判断u1和u2里是否含有1:
unsigned x=0x00707000;
x=(x&0xffff0000)||(x&0x0000ffff);
根据与运算符的规则,如果最高位1在 u 1 u_1 u1, 那么x的值为x&0xffff0000
,所有 u 2 u_2 u2部分值都会被抹去。反之,x的值为x&0x0000ffff
,所有 u 1 u_1 u1部分值都会被抹去。
因此其值变为0x00700000。此时再折半判断:
- 若u1包含最高位1,则在 u 11 = b 31 b 30 ⋅ ⋅ ⋅ b 25 b 24 u_{11}=b_{31}b_{30}···b_{25}b_{24} u11=b31b30⋅⋅⋅b25b24和 u 12 = b 23 b 22 ⋅ ⋅ ⋅ b 17 b 16 u_{12}=b_{23}b_{22}···b_{17}b_{16} u12=b23b22⋅⋅⋅b17b16里判断。
- 若u2包含最高位1,则在 u 21 = b 15 b 14 ⋅ ⋅ ⋅ b 9 b 8 u_{21}=b_{15}b_{14}···b_{9}b_{8} u21=b15b14⋅⋅⋅b9b8和 u 12 = b 7 b 6 ⋅ ⋅ ⋅ b 1 b 0 u_{12}=b_{7}b_{6}···b_{1}b_{0} u12=b7b6⋅⋅⋅b1b0里判断。
这两种情况实际上使互斥的,即 u 11 u_{11} u11和 u 12 u_{12} u12会同时有可能,但 u 11 u_{11} u11和 u 21 u_{21} u21不可能同时发生。
因此合并成两种判断情况:
- 最高位在 u 11 u_{11} u11或 u 21 u_{21} u21,此时
x&(0xff00ff00)
。 - 最高位在 u 12 u_{12} u12或 u 22 u_{22} u22,此时
x&(0x00ff00ff)
。
以此类推,则可表示为:
unsigned x=0x00707000;
x=(x&0xffff0000)||(x&0x0000ffff);
x=(x&0xff00ff00)||(x&0x00ff00ff);
x=(x&0xf0f0f0f0)||(x&0x0f0f0f0f);
x=(x&0xbbbbbbbb)||(x&0x33333333);
x=(x&0xaaaaaaaa)||(x&0x55555555);
其复杂度为 l o g 2 w log_2w log2w,w为位级表示的位数。
完…
边栏推荐
- MySQL数据表操作实战
- PyTorch builds a classification network model (Mnist dataset, fully connected neural network)
- IDO代币预售dapp开发及NFT模式
- 金立前高管团队再战手机市场,创立新品牌“FreeYond”
- Golang interface interface
- 国产替代风潮下,电子元器件B2B商城系统如何助力企业突围市场竞争
- 【二叉树】从二叉树一个节点到另一个节点每一步的方向
- 8/2 训练日志(dp+思维+字典树)
- GameFi industry down but not out | June Report
- 如何让history历史记录前带时间戳
猜你喜欢
PyTorch构建分类网络模型(Mnist数据集,全连接神经网络)
[OpenCV] Cascade classifier training model
[Practical skills] APP video tutorial for updating APP in CANFD, I2C, SPI and serial port mode of single-chip bootloader (2022-08-01)
Relia Tech活性VEGFR重组蛋白丨小鼠 VEGF120实例展示
An animation basic element movie clip effect
超大规模的产业实用语义分割数据集PSSL与预训练模型开源啦!
IDEA的模板(Templates)
细胞图像数据的主动学习
客户:我们系统太多,能不能实现多账号互通?
Zhang Le: The Golden Triangle of R&D Efficiency and Practice in the Field of Demand and Agile Collaboration|Live Review
随机推荐
网易互娱在秒级监控、服务限流、AIOps落地上的运维升级实践
Forrester:行业云帮助中国企业更快适应未来的发展
An animation based button animation combined with basic code
js \n\r 换行失败 :【white-space: pre-line;】${} Template Literals
leetcode/字符串中的所有变位词(s1字符串的某个排列是s2的子串)的左索引
svn安装包和客户端
厨卫电器行业数字化集采管理系统:优化产业供应结构,实现采购业务流程集中管控
How to make the history record time-stamped before
鸿湖万联扬帆富设备开发板正式合入OpenHarmony主干
secureCRT连接开发板连接不上问题解决
[web penetration] detailed explanation of CSRF vulnerability
美国拟对华禁售128层以上NAND Flash制造设备
c语言结构体知识总结
sessionStorage of BOM series
函数在结构体中的应用练习
TensorFlow离线安装包
华云数据张华林:投身数字蓝海 绘就云上强国
[Practical skills] APP video tutorial for updating APP in CANFD, I2C, SPI and serial port mode of single-chip bootloader (2022-08-01)
ITSM软件与工单系统的区别是什么?
MySQL知识总结 (十二) 数据库相关概念