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


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

    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为位级表示的位数。



    完…

  • 相关阅读:
    在 Spring Security中授予权限与角色
    那些年用Python踩过的坑
    计算机毕业设计 基于java的高校竞赛和考级查询系统的设计与实现 Java实战项目 附源码+文档+视频讲解
    哪一款运动蓝牙耳机比较好、2022最值得入手的运动耳机
    SpringCloudAlibaba全网最全讲解5️⃣之Feign(建议收藏)
    删除不必要的内核模块
    数字颠倒输出
    leetcode-07-[344]反转字符串[541]反转字符串II[卡码网54]替换数字
    Linux CentOS 8(firewalld的配置与管理)
    C++中的多态
  • 原文地址:https://blog.csdn.net/Once_day/article/details/126085290