算法通关村第11关【白银】| 位运算高频算法题

一、移位的妙用

1.位1的个数

思路:

利用一个数和1与操作,结果就是最低位的特点,每次右移都能知道一位是不是1

public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int count = 0;for(int i = 0;i<32;i++){count += (n >> i) & 1;}return count;  }
}

n-1 将最低位的 '1' 变为 '0',并将低位的 '0' 变为 '1',然后与 n 进行按位与运算,即可将最低位的 '1' 置为 '0'。这个算法的精妙之处在于,它不需要遍历所有的位,而是通过不断地将最低位的 '1' 置为0来计算 '1' 的个数,从而实现了高效的计算。这对于处理大量二进制数据的情况非常有用。

public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int count = 0;while((n != 0)){n = n&(n-1);count++;}return count;  }
}

2.比特位计数

思路:从0到n循环执行求位1的个数

class Solution {public int[] countBits(int n) {int[] ans = new int[n+1];for(int i = 0;i<=n;i++){int num = i;while(num > 0){ans[i]++;num = num & (num-1);}}return ans;}
}

3.颠倒二进制位

思路:不断将 n 的最低位复制到结果的对应位置,实现了二进制位的翻转。值得注意的是,这里处理的是无符号整数,因此不需要考虑符号位,Java使用逻辑移位符号>>>

public int reverseBits(int n) {int res = 0; // 用于存储翻转后的结果int pos = 31; // 由于 int 是32位,所以从最高位开始处理,即第31位while (pos >= 0) { // 从最高位向最低位循环处理res += (n & 1) << pos; // (n & 1) 取得 n 的最低位,并将其左移 pos 位pos--; // 处理下一位n = n >>> 1; // 右移 n,去掉已经处理过的最低位}return res; // 返回翻转后的结果
}

 二、位实现加减乘除专题

1.两数之和

思路:进位求和+不进位求和

  1. 进入 while 循环,只要 b 不等于0,就继续执行。这个循环会一直执行,直到没有进位产生,也就是 b 变成0。

  2. 在循环中,首先计算进位 carry。进位是通过将 ab 进行按位与操作 a & b,然后将结果左移一位 << 1 得到的。这一步模拟了进位的计算。

  3. 接下来,通过异或操作 a ^ b 求得不包括进位的和。异或操作可以将两个数相加,但不考虑进位。

  4. 将进位 carry 的值赋给 b,以便将进位传递到下一轮循环。

  5. 继续循环,直到没有进位产生,也就是 b 变成0。

  6. 最后,返回 a,即最终的和。

class Solution {public int getSum(int a, int b) {while(b != 0){int carry = (a&b)<<1;a = a ^ b;b = carry;}return a;}
}

以123+623为例:

1. 初始状态:a = 123(二进制 1111011),b = 623(二进制 1001110111)。

2. 进入循环,b 不等于 0:

   - 计算进位 `carry`:(a & b) << 1 = (1111011 & 1001110111) << 1 = (1001011) << 1 = 10010110。

   - 计算不包括进位的和 `a`:a = a ^ b = 1111011 ^ 1001110111 = 1001010100。

   - 将进位传递给 `b`:b = carry = 10010110。

3. 进入下一轮循环,b 不等于 0:

   - 计算进位 `carry`:(a & b) << 1 = (1001010100 & 10010110) << 1 = 10000000 << 1 = 100000000。

   - 计算不包括进位的和 `a`:a = a ^ b = 1001010100 ^ 10010110 = 1001110010。

   - 将进位传递给 `b`:b = carry = 100000000。

4. 进入下一轮循环,b 不等于 0:

   - 计算进位 `carry`:(a & b) << 1 = (1001110010 & 100000000) << 1 = 100000000 << 1 = 1000000000。

   - 计算不包括进位的和 `a`:a = a ^ b = 1001110010 ^ 100000000 = 1001110010。

   - 将进位传递给 `b`:b = carry = 1000000000。

5. 进入下一轮循环,b 不等于 0:

   - 计算进位 `carry`:(a & b) << 1 = (1001110010 & 1000000000) << 1 = 1000000000 << 1 = 10000000000。

   - 计算不包括进位的和 `a`:a = a ^ b = 1001110010 ^ 1000000000 = 1001110010。

   - 将进位传递给 `b`:b = carry = 10000000000。

6. 进入下一轮循环,b 不等于 0:

   - 计算进位 `carry`:(a & b) << 1 = (1001110010 & 10000000000) << 1 = 0 << 1 = 0。

   - 计算不包括进位的和 `a`:a = a ^ b = 1001110010 ^ 0 = 1001110010。

   - 将进位传递给 `b`:b = carry = 0。

7. 进入下一轮循环,b 等于 0,循环结束。

8. 返回最终结果 `a`,即 1001110010 对应的十进制数,结果是 746。

所以,123 + 623 的结果是 746,这个算法成功地完成了加法操作。

2.递归乘法

普通解法,将乘法转换成多次加法

class Solution {public int multiply(int A, int B) {int res = 0;if(A>B){int t = A;A = B;B =t;}while(A-->0){res += B;}return res;}
}

思路:【优化】将两个数相乘的过程转化为一系列的加法和移位操作,从而减少了乘法运算的次数

n = a0*2^0 + a1*2^1 + a2*2^2 + a3*2^3........+ak*2^k

拆分成2的幂的和的方法是将乘法操作分解成了多次左移和加法操作,这是一种基于二进制的思考方式,也是快速乘法的一部分。

举例说明:13 * 12 = 13 * (8 + 4) = 13 * 8 + 13 * 4 = (13 << 3) + (13 << 2)

这个示例中,我们首先将12分解为8和4,然后用13分别乘以8和4。在二进制视角下,8可以表示为2的三次方(8 = 2^3),4可以表示为2的二次方(4 = 2^2)。因此,我们可以将这个乘法操作分解为两个左移和相加的操作。

  1. 首先,将13左移3位,得到13 * 8 = (13 << 3)。
  2. 接下来,将13左移2位,得到13 * 4 = (13 << 2)。
  3. 最后,将这两个部分相加,即(13 << 3) + (13 << 2),就得到了13 * 12的结果。

这种方法充分利用了二进制的特性,通过左移和相加的方式来实现乘法操作,从而提高了计算效率。

  1. 首先,将13和12转换为二进制数。13的二进制表示是1101,12的二进制表示是1100。

  2. 初始化结果为0。

  3. 从右往左,第一个数为0,进行2次幂,13*2。

  4. 第二个数的最右位是0,进行2次幂,13*2*2。

  5. 第二个数的下一位是1,乘数的二进制现在为0011,这时我们将结果加上,(最低位碰到1说明一次拆分完成要相加了)结果变为13*2*2(进行了4次加法)。

  6. 乘数对半减小0001,被乘数进行2次幂,13*2*2*2

  7. 接下来是第三位,同样是1,这时将结果再次加上13*2*2*2(8次加法),结果变为13*2*2(4次)+13*2*2*2(8次)。

  8. 最后一位是0,不进行任何操作。

  9. 现在,我们已经完成了所有位的计算,结果是13*12。

例如:14*127(11111111)/ (1+2+4+8+16+32+64)

14*127 = 14*1+14*2+14*4+14*8+14*16+14*32+14*64

14*125(11111101)= 14*1+14*4+14*8+14*16+14*32+14*64

class Solution {public int multiply(int A, int B) {int min = Math.min(A,B);int max = Math.max(A,B);int ans = 0;while(min!=0){//奇数相加if((min&1) == 1){ans += max;}min = min >> 1; //对半减小乘数max += max; //进行2的幂次}return ans;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/67605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据库尚硅谷学习笔记

文章目录 Oracle数据库体系结构简介补充SQL初步导入sql文件别名连接符distinct去重的坑 过滤和排序数据日期格式比较运算其它比较运算符逻辑运算优先级排序 单行函数SQL中不同类型的函数单行函数字符数值日期转换通用 使用条件表达式嵌套查询 多表查询等值连接非等值连接左外连…

解决微信小程序recycle-view使用百分比单位控制宽高时出现的内容溢出问题

recycle-view是微信小程序官方推出的一个经过优化的长列表组件&#xff0c;但是在使用百分比单位控制高宽时有个内容溢出问题&#xff0c;虽然它提供了height和width的参数可以设置宽高&#xff0c;但每次写列表都需要去js里获取宽高并设置是较为麻烦的&#xff0c;所以现在来着…

ES是一个分布式全文检索框架,隐藏了复杂的处理机制,核心数据分片机制、集群发现、分片负载均衡请求路由

ES是一个分布式框架&#xff0c;隐藏了复杂的处理机制&#xff0c;核心数据分片机制、集群发现、分片负载均衡请求路由。 ES的高可用架构&#xff0c;总体如下图&#xff1a; 说明&#xff1a;本文会以pdf格式持续更新&#xff0c;更多最新尼恩3高pdf笔记&#xff0c;请从下面…

Qt/C++音视频开发49-推流到各种流媒体服务程序

一、前言 最近将推流程序完善了很多功能&#xff0c;尤其是增加了对多种流媒体服务程序的支持&#xff0c;目前支持mediamtx、LiveQing、EasyDarwin、nginx-rtmp、ZLMediaKit、srs、ABLMediaServer等&#xff0c;其中经过大量的对比测试&#xff0c;个人比较建议使用mediamtx和…

QT DAY6

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);socket new QTcpSocket(this);//如果连接服务器成功&#xff0c;该客户端就会发射一个connected的信号。//我们…

MyBatis关系映射

文章目录 前言一、一对一映射1.1 创建实体1.2 xml配置 二、一对多映射2.1 创建实体2.2 resultMap配置2.3 测试 三、 多对多映射3.1 创建实体3.2 resultMap配置3.3 测试 前言 MyBatis是一个Java持久化框架&#xff0c;它提供了一种将数据库表和Java对象之间进行关系映射的方式。…

css画箭头图标放标题前面,旋转,border的单个边框设置

CSS边框属性_css border dotted_小张biubiu的博客-CSDN博客 你还不知道css的旋转效果怎么实现&#xff1f;来这里看看吧_css旋转效果_我糖呢的博客-CSDN博客 .sub-title{position: relative;margin-left: 59px;& span{color: #1CDBFE;};& span::before{content: "…

算法通关村十四关:青铜-堆结构

青铜挑战-堆结构 堆结构&#xff1a;重要的基础数据结构 明确什么类型的题目可以用堆&#xff0c;以及如何用堆来解决 堆的构造和维护过程都非常复杂 1.堆的概念与特征 1.1基本概念 堆&#xff1a;是将一组数据按照 完全二叉树 的存储顺序&#xff0c;将数据存储在一个一…

S32K324芯片学习笔记

文章目录 Core and architectureDMASystem and power managementMemory and memory interfacesClocksSecurity and integrity安全与完整性Safety ISO26262Analog、Timers功能框图内存mapflash Signal MultiplexingPort和MSCR寄存器的mapping Core and architecture 两个Arm Co…

centOS下载与安装

1 下载centOS镜像 The CentOS Project 选择阿里云的镜像 2 下载虚拟机 Vmware workstation VMware - Delivering a Digital Foundation For Businesses 1 下载安装 centOs是一个操作系统&#xff0c;操作硬件的。所以需要有机器&#xff0c;可以使用虚拟机。 2 创建新的虚…

深入理解联邦学习——联邦学习的分类:基础知识

分类目录&#xff1a;《深入理解联邦学习》总目录 在实际中&#xff0c;孤岛数据具有不同分布特点&#xff0c;根据这些特点&#xff0c;我们可以提出相对应的联邦学习方案。下面&#xff0c;我们将以孤岛数据的分布特点为依据对联邦学习进行分类。 考虑有多个数据拥有方&…

利用python制作AI图片优化工具

将模糊图片4K高清化效果如下&#xff1a; 优化前的图片 优化后如下图&#xff1a; 优化后图片变大变清晰了效果很明显 软件界面如下&#xff1a; 所用工具和代码&#xff1a; 1、所需软件包 网盘链接&#xff1a;https://pan.baidu.com/s/1CMvn4Y7edDTR4COfu4FviA提取码&…

【SpringMVC】工作流程及入门案例

目录 前言 回顾MVC三层架构 1. SpringMVC简介 …

《智能网联汽车自动驾驶功能测试规程》

一、 编制背景 2018 年4 月12 日&#xff0c;工业和信息化部、公安部、交通运输部联合发布《智能网联汽车道路测试管理规范(试行)》&#xff08;以下简称《管理规范》&#xff09;&#xff0c;对智能网联汽车道路测试申请、审核、管理以及测试主体、测试驾驶人和测试车辆要求等…

船舶稳定性和静水力计算——绘图体平面图,静水力,GZ计算(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Qt鼠标点击事件处理:显示鼠标点击位置(完整示例)

Qt 入门实战教程&#xff08;目录&#xff09; 前驱文章&#xff1a; Qt Creator 创建 Qt 默认窗口程序&#xff08;推荐&#xff09; 什么是事件 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。 事件&#xff08;event&#xff09;驱动…

RHCA之路---EX280(4)

RHCA之路—EX280(4) 1. 题目 Use the S2I functionality of your OpenShift instance to build an application in the rome project Use the Git repository at http://services.lab.example.com/php-helloworld for the application source Use the Docker image labeled re…

java八股文面试[数据库]——mysql主从复制

什么是mysql的主从复制&#xff1f; MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式&#xff0c;这样从节点不用一直访问主服务器来更新自己的数据&#xff0c;数据的更新可以在远程连接上进行&#xff0c;从节点…

【Spring Boot】使用MyBatis注解实现数据库操作

使用MyBatis注解实现数据库操作 MyBatis还提供了注解的方式&#xff0c;相比XML的方式&#xff0c;注解的方式更加简单方便&#xff0c;无须创建XML配置文件。接下来好好研究注解的使用方式。 1.XML和注解的异同 1&#xff09;注解模式使用简单&#xff0c;开发效率高&#…

【SpringSecurity】十一、SpringSecurity集成JWT实现token的方法与校验

文章目录 1、依赖与配置2、JWT工具类3、认证成功处理器4、创建JWT过滤器5、安全配置类 1、依赖与配置 添加JWT的maven依赖&#xff1a; <!-- 添加jwt的依赖 --> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId…