• 位级运算之提取位级表示的最高位


    位级运算之提取位级表示的最高位

    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
    • 2

    根据与运算符的规则,如果最高位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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其复杂度为 l o g 2 w log_2w log2w,w为位级表示的位数。



    完…

  • 相关阅读:
    基于STM32的烟雾浓度检测报警仿真设计(仿真+程序+讲解视频)
    C语言笔记(进行中)!!!
    面向对象编程
    中小型企业网络实战topo
    QFramework引入Command
    防火墙最新技术汇总
    SQL自学进阶知识点
    深度学习入门-与学习相关的技巧
    【小笔记】当一个算法性能不满意,可能是这几方面的原因
    qemu的详细资料大全(入门必看!!!)
  • 原文地址:https://blog.csdn.net/Once_day/article/details/126085290