首页 > 其他分享 >位运算的应用

位运算的应用

时间:2024-01-18 23:03:18浏览次数:26  
标签:cnt return 运算 权重 int 31 应用 汉明

内容学习自 https://oi-wiki.org/math/bit/

2的幂

位运算用于2的整数次幂可以优化复杂度

//计算 n * (2^m)
int mulPowerOfTwo(int n, int m) {
    return n << m;
}
//计算 n / (2^m)
int divPowerOfTwo(int n, int m) {
    return n >> m;
}

注意:/ 除法是向 0 取整,而右移是向下取整。

取绝对值

在某些机器上,效率比 n > 0 ? n : -n 高。

int abs(int n) {
    return (n ^ (n >> 31)) - (n >> 31);
}

int 类型占32位,n >> 31 取得 n 的符号,若 n 为正数,结果为 0,若 n 为负数,则结果为 -1。
若 n 为正数,(n ^ 0) - 0 仍是 n;
若 n 为负数,(n ^ -1) - -1) 相当于对 n 按位取反末尾加 1。

取两个数的最大/最小值

在某些机器上,效率比 a > b ? a : b 高。

// 如果 a >= b, (a - b) >> 31 为 0,否则为 -1
int max(int a, int b) { 
    return (b & ((a - b) >> 31)) | (a & (~(a - b) >> 31)); 
}
int min(int a, int b) { 
    return (a & ((a - b) >> 31)) | (b & (~(a - b) >> 31)); 
}

判断两非零数符号是否相同

bool isSameSign(int x, int y) { //有 0 的情况除外
    return (x ^ y) >=0
}

交换两个整数

void swap(int &a, int &b) {
    a ^= b;
    b ^= a;
    a ^= b;
}

但其实不推荐使用这种方式,推荐临时变量法:

void swap(int &a, int &b) {
    int tmp = a;
    a = b;
    b = tmp;
}

对于临时变量法,每次赋值只要读取一个变量的值到寄存器,然后再从寄存器写回到另一个变量中即可,前后涉及两次内存操作;对于异或运算,每次都需要读取两个数据到寄存器中。然后进行运算,将结果写回变量中,前后共需三次内存操作。另外就是异或操作的代码可读性差。

操作一个数的二进制位

// 获取一个数二进制的某一位
// 获取 a 的第 b 位,最低位编号为 0
int getBit(int a, int b) {
    return (a >> b) & 1;
}

// 将一个数二进制的某一位设置为0
// 将 a 的第 b 位设置为 0 ,最低位编号为 0
int unsetBit(int a, int b) { 
    return a & ~(1 << b);
}

//将一个数二进制的某一位设置为 1
// 将 a 的第 b 位设置为 1 ,最低位编号为 0
int setBit(int a, int b) { 
    return a | (1 << b);
}

//将一个数二进制的某一位取反
// 将 a 的第 b 位取反 ,最低位编号为 0
int flapBit(int a, int b) { 
    return a ^ (1 << b); 
}

汉明权重

汉明权重是一串符号中不同于(定义在其所使用的字符集上的)零符号(zero-symbol)的个数。对于一个二进制数,它的汉明权重就等于它 1 的个数(即 popcount)。

求一个数的汉明权重可以循环求解:我们不断地去掉这个数在二进制下的最后一位(即右移 1 位),维护一个答案变量,在除的过程中根据最低位是否为 1 更新答案。

代码如下:

// 求 x 的汉明权重
int popcount(int x) {
    int cnt = 0;
    while (x) {
        cnt += x & 1;
        x >>= 1;
    }
    return cnt;
}

求一个数的汉明权重还可以使用 lowbit 操作:我们将这个数不断地减去它的 lowbit4,直到这个数变为 0。

代码如下:

// 求 x 的汉明权重
int popcount(int x) {
    int cnt = 0;
    while (x) {
        cnt++;
        x -= x & -x;
    }
    return cnt;
}

标签:cnt,return,运算,权重,int,31,应用,汉明
From: https://www.cnblogs.com/hzyuan/p/17973619

相关文章

  • 以新晋高速公路快村营至营盘段项目为例浅谈AcrelEMS-HIM高速公路综合能效系统的应用
    引言摘要:我国新型工业化、信息化、城镇化和农业现代化加快发展,经济结构加快转型,交通运输总量将保持较快增长态势,各项事业发展要求提高国家公路网的服务能力和水平。高速公路沿线的收费站、互通枢纽、服务区、隧道等配置的供配电、照明、通风、排水等机电设备的数量急聚增加,设计一套......
  • 电气火灾监控系统的应用研究分析
    摘要:主要介绍了电气火灾的主要原因、几种电气火灾监控系统的构成和设立意义。参照各规范,讨论了宜设立电气火灾监控系统的场所。该系统的设立可大大减少电气火灾事故的发生,对保证人们的生命财产安全具有重要意义。关键词:电气火灾;电气火灾监控系统;火灾报警系统1重、特大电气火灾数据......
  • SpringMVC中@pathVariable 为spring的注解,都可以用在Controller 层接受前段传递的数据
    @PathVariable主要接收http://host:port/path{参数值}数据 @pathVariable作为借口是,url是http"//ww.yoodb.com/user/getUserById/2 @RequestParam主要用于接受http://host:port/path?参数名=值数据值 @ResquesrParam请求接口时,url是http://www.yoodb.com/user/getUsrBy......
  • Spring Boot 单体应用升级 Spring Cloud 微服务
    作者:刘军SpringCloud是在SpringBoot之上构建的一套微服务生态体系,包括服务发现、配置中心、限流降级、分布式事务、异步消息等,因此通过增加依赖、注解等简单的四步即可完成SpringBoot应用到SpringCloud升级。*SpringCloudAlibaba(SCA)官网正式上线:sca.aliyun.co......
  • BOSHIDA 探索直流电源模块的应用领域
    BOSHIDA探索直流电源模块的应用领域直流电源模块广泛应用于许多领域,包括电子设备、通信、工业自动化、航空航天等。以下是一些常见的应用领域: 1.电子设备:直流电源模块用于给各种电子设备供电,如计算机、手机、平板电脑、摄像机等。2.通信:直流电源模块用于为通信设备供电,如......
  • (7)Powershell算术运算符
    (7)Powershell算术运算符本系列博客从这一节开始是Powershell的语法知识,在开始学习语法之前,希望你对Powershell有个基本的了解,比如开发工具的使用,面向对象等特性,详细内容使劲戳这里(1)-(6)的内容。本节主要介绍Powershell中的算术运算符。Powershell支持以下算术运算符......
  • spring--Bean的作用域及应用场景
    这六种SpringBean的作用域适用于不同的应用场景:Singleton:在SpringIoC容器中仅存在一个Bean实例,Bean以单例方式存在。无论我们是否在配置文件中显式定义,所有的SpringBean都默认为singleton作用域。应用场景:当你需要全局共享一个实例时,例如服务类、工具类或者配置类。示......
  • 鸿蒙应用开发者基础认证考试(答案)
    高亮是易错题main_pages.json存放页面page路径配置信息。(正确)1.在stage模型中,下列配置文件属于AppScope文件夹的是?(C)A.main_pages.jsonB.module.json5C.app.json5(build-profile.json5)D.package.json2.module.json5配置文件中,包含了以下哪些信息?(ABD)A.ability的相......
  • 刷题 位运算异或 异或前缀和
    2024.1.18杭州电子科技大学2023华为杯编程竞赛 解题思路首先可以知道,我们任意选一点为根root往下递归异或就可以得到f[i](root到i的路径异或值),那么 l到r的路劲异或值可以由f[l]^f[r]得出那么如何计算答案呢,就是用f[l]~f[r]分别异或f[x]......
  • Web Components从技术解析到生态应用个人心得指北
    WebComponents浅析WebComponents是一种使用封装的、可重用的HTML标签、样式和行为来创建自定义元素的Web技术。WebComponents自己本身不是一个规范,而是一套整体技术,包含下面3个独立规范:CustomElements:允许开发者定义自己的HTML标签(考虑SEO,还是语义化为好)。Sha......