力扣150题——位运算

news2024/9/20 20:50:25

位运算概述

位运算(Bitwise Operation)是计算机底层操作中的一种,用来直接对整数的二进制位进行操作。位运算通常速度很快,且消耗的内存较少,在处理一些特定问题(如加密算法、图像处理、低级硬件编程等)时非常有用。

常见的位运算符

位运算符用于直接操作整数的二进制位。以下是 Java 中常见的位运算符:

  • 按位与(&)

    逐位比较两个数的二进制表示,只有对应位都为 1,结果的该位才为 1,否则为 0。

    示例:5 & 3

5 的二进制为 0101
3 的二进制为 0011
0101 & 0011 = 0001
结果为 1

  • 按位或(|)

    逐位比较两个数的二进制表示,只要对应位有一个为 1,结果的该位为 1。

    示例:5 | 3

0101 | 0011 = 0111
结果为 7

  • 按位异或(^)

    逐位比较两个数的二进制表示,只有对应位不相同,结果的该位为 1,否则为 0。

    示例:5 ^ 3

0101 ^ 0011 = 0110
结果为 6

  • 按位取反(~)

    对一个数的每一位取反,即 0 变为 1,1 变为 0。

    示例:~5

5 的二进制为 0101
取反后为 1010,即 -6(在计算机中负数用补码表示)。

  • 左移(<<)

    将二进制位整体左移,右侧补 0,相当于乘以 2 的若干次方。

    示例:5 << 1

5 的二进制为 0101
左移 1 位后为 1010,即 10

  • 右移(>>)

    将二进制位整体右移,左侧用符号位(正数补 0,负数补 1)填充,相当于除以 2 的若干次方。

    示例:5 >> 1

5 的二进制为 0101
右移 1 位后为 0010,即 2

  • 无符号右移(>>>)

    不管正负,左侧都用 0 填充,右移。

    示例:-5 >>> 1

-5 的二进制为 11111111111111111111111111111011
右移 1 位后为 01111111111111111111111111111101,即 2147483645

位运算的常见应用

  • 奇偶判断

        判断一个数是否为偶数:n & 1 == 0,如果最低位是 0,则该数是偶数。

  • 交换两个数

        不使用额外变量交换两个数:

a = a ^ b;
b = a ^ b;
a = a ^ b;
  • 清除最低位的 1

        清除最低位的 1:n = n & (n - 1),常用于统计一个数的二进制表示中有多少个 1。

  • 获取最低位的 1

        获取最低位的 1:n & -n

  • 乘法和除法优化

        乘以 2 的 n 次方:a << n
        除以 2 的 n 次方:a >> n

位运算的优势

  1. 速度快:因为位运算是在底层直接操作二进制数据,运算速度非常快。
  2. 节省空间:位运算可以使用更少的内存来表示复杂的信息。
  3. 应用广泛:适用于底层硬件编程、加密、图像处理等领域。

通过位运算,许多看似复杂的问题可以简化为高效的操作,因此在编写高性能程序时经常使用。

题解

颠倒二进制位

题目

190. 颠倒二进制位 - 力扣(LeetCode)

思路

  • 遍历 32 位整数的每一位。
  • 通过位移操作,将该位移动到正确的位置。
  • 利用按位或 (|) 和移位操作,构造颠倒后的数字。

代码

public int reverseBits(int n) {
        int result = 0;
        for (int i = 0; i < 32; i++) {
            int lastBit = n & 1;
            result = (result << 1) | lastBit;
            n >>= 1;
            System.out.println(lastBit+" "+result+" "+n);
        }
        return result;
    }

位1的个数

题目

191. 位1的个数 - 力扣(LeetCode)

思路

  • 遍历 32 位整数的每一位。
  • 通过异或,判断是否为1
  • 计数并移位

代码

 public int hammingWeight(int n) {
        int sum=0;
        for(int i=0;i<32;i++){
            if((n&1)==1){
                sum++;
            }
            n>>=1;
        }
        return sum;
    }

只出现一次的数字Ⅱ

题目

137. 只出现一次的数字 II - 力扣(LeetCode)

思路

我们使用两个变量 ones 和 twos 来分别表示二进制位的不同状态:

  1. ones 表示当前位出现了 1 次;
  2. twos 表示当前位出现了 2 次。

对于每个数字 num,我们按位更新 ones 和 twos:

  1. 当一个数的某一位已经在 ones 中,我们将它加到 twos 中;
  2. 如果某一位已经在 twos 中,我们就将它清除。

代码

public int singleNumber(int[] nums) {
        int one=0;
        int two=0;
        for(int num:nums){
            two=two|(one&num);
            one=one^num;
            int t=~(one&two);
            one=one&t;
            two=two&t;
        }
        return one;
    }

数字范围按位与

题目

201. 数字范围按位与 - 力扣(LeetCode)

思路

  • 如果 left 和 right 的某些高位不同,则在这个不同位及更低的位上,所有数的按位与结果一定为 0
  • 因此问题可以转化为寻找left和right的公共前缀,再将其左移n位,n为寻找公共前缀移位的长度

代码

public int rangeBitwiseAnd(int left, int right) {
        int sum = 0;
        while(left!=right){
            left=left>>1;
            right=right>>1;
            sum++;
        }
        return left<<sum;
    }

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

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

相关文章

【RabbitMQ】应用

RabbitMQ 应用 1. 七种⼯作模式介绍1.1 Simple(简单模式)1.2 Work Queue(⼯作队列)1.3 Publish/Subscribe(发布/订阅)概念介绍Publish/Subscribe模式 1.4 Routing(路由模式)1.5 Topics(通配符模式)1.6 RPC(RPC通信)1.7 Publisher Confirms(发布确认) 2. ⼯作模式的使⽤案例2.1 …

Java【代码 18】处理Word文档里的Excel表格数据(源码分享)

处理Word文档里的Excel表格数据 1.原始数据2.处理程序2.1 识别替换表格表头2.2 处理多余的换行符2.3 处理后的结果 3.总结 1.原始数据 Word 文档里的 Excel 表格数据&#xff0c;以下仅为示例数据&#xff1a; 读取后的字符串数据为&#xff1a; "姓名\r\n身份证号\r\n手…

【计网】从零开始使用TCP进行socket编程 ---服务端业务模拟Xshell

最糟糕的情况&#xff0c; 不是你出了错&#xff0c; 而是你没有面对出错的勇气。 从零开始使用TCP进行socket编程 1 通信过程的多版本实现1.1 多进程版本1.2 多线程版本 2 服务端业务模拟Xshell2.1 整体框架设计2.2 Command类设计 1 通信过程的多版本实现 在前一篇的文章…

鸿蒙手势交互(三:组合手势)

三、组合手势 由多种单一手势组合而成&#xff0c;通过在GestureGroup中使用不同的GestureMode来声明该组合手势的类型&#xff0c;支持顺序识别、并行识别和互斥识别三种类型。 GestureGroup(mode:GestureMode, gesture:GestureType[]) //- mode&#xff1a;为GestureMode枚…

美元降息,对普通人有哪些影响?

美元降息&#xff0c;对普通人有哪些影响&#xff1f; 美元降息了。很多朋友都说我又不炒股&#xff0c;我手里又没有美金&#xff0c;美元跟我有啥关系啊&#xff1f;那我们就来聊聊美元降息&#xff0c;对我们国内经济到底有哪些影响&#xff1f;你再来看看跟你有没有关系&a…

计算机毕业设计 美发管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

MySQL高阶1890-2020年最后一次登录

目录 题目 准备数据 分析数据 题目 编写解决方案以获取在 2020 年登录过的所有用户的本年度 最后一次 登录时间。结果集 不 包含 2020 年没有登录过的用户。 返回的结果集可以按 任意顺序 排列。 准备数据 Create table If Not Exists Logins (user_id int, time_stamp …

数据库-约束与多表查询

1.约束 例子&#xff1a; 外键约束 例子&#xff1a; 2.多表查询 多表关系 概述 内连接 外连接 自连接 联合查询 子查询 介绍 标量子查询 仅有一个值 列子查询 行子查询 表子查询 练习

【应用开发三】 input子系统介绍

文章目录 1 名词解释2 输入设备编程框架2.1 input子系统2.2 读取数据流程2.3 input_event结构体2.3.1 type&#xff08;哪类事件&#xff09;2.2 code&#xff08;具体事件&#xff09;2.3 value&#xff08;数值&#xff09; 2.4 数据同步2.5 读取start input_event数据 1 名词…

微信小程序如何引入第三方插件

前言 微信的文档不行&#xff0c;我这个&#xff0c;行 如何找到插件管理的页面 扫码登录微信小程序的后台设置页面&#xff0c;点击小程序信息的查看详情&#xff0c;然后点第三方设置 修改app.json 在插件管理的页面添加好要用的插件之后&#xff0c;在插件的详情页面找到…

C++学习指南(六)----list

欢迎来到繁星的CSDN。本期内容主要包括&#xff0c;list的介绍、使用以及与vector的优缺点。 一、什么是list 在先前的C语言学习中&#xff0c;我们接触到了顺序表和链表&#xff0c;而在C中&#xff0c;这正好对应了vector&#xff08;动态增长顺序表&#xff09;和l…

机器学习(西瓜书)第 10 章 降维与度量学习

10.1 k近邻学习kNN k 近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法,其工作机制非常简单&#xff1a;给定测试样本&#xff0c;基于某种距离度量找出训练集中与其最靠近的k个训练样本&#xff0c;然后基于这k个 “邻居”的信息来进行预测.通常&#xff0c;在…

常用排序算法时间复杂度和稳定性

以下是常用排序算法时间复杂度和稳定性&#xff0c;也是常考的&#xff1a;

如何衡量企业品牌力?判断指标有哪些?

企业品牌力是指品牌在市场中的竞争力和影响力&#xff0c;它反映了品牌的价值、知名度、忠诚度、感知质量、差异化以及市场表现等方面。要去衡量一个企业的品牌力&#xff0c;大多从品牌的知名度、忠诚度、所占市场份额、顾客口碑、社媒影响力、品牌资产价值等多方面去判断。我…

【计网】从零开始使用TCP进行socket编程 --- 客户端与服务端的通信实现

阵雨后放晴的天空中&#xff0c; 出现的彩虹很快便会消失。 而人心中的彩虹却永不会消失。 --- 太宰治 《斜阳》--- 从零开始使用TCP进行socket编程 1 TCP与UDP2 TCP服务器类2.1 TCP基础知识2.2 整体框架设计2.3 初始化接口2.4 循环接收接口与服务接口 3 服务端与客户端测试…

Jboss CVE-2015-7501 靶场攻略

漏洞介绍 这是经典的JBoss反序列化漏洞&#xff0c;JBoss在/invoker/JMXInvokerServlet请求中读取了⽤户传⼊的对象&#xff0c;然后我们利⽤Apache Commons Collections中的 Gadget 执⾏任意代码 影响范围 JBoss Enterprise Application Platform 6.4.4,5.2.0,4.3.0_CP10 …

使用API有效率地管理Dynadot域名,为域名进行隐私保护设置

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

欧美海外仓系统有哪些服务商选择?

在跨境电商的全球化浪潮中&#xff0c;欧美市场以其成熟的电商生态和庞大的消费群体&#xff0c;成为了众多跨境卖家竞相争夺的高地。为了提升物流效率、降低成本并增强客户体验&#xff0c;海外仓成为了不可或缺的一环。而海外仓系统的选择&#xff0c;则直接关系到仓库的运营…

qt--Qml控件库如何从外部导入

文章目录 两种方案方案1 给项目添加子项目方案2 使用pri文件 综合来说 &#xff1a; 两种方案 方案1 给项目添加子项目 利用git的特性 对应的子项目就是我们的控件库 然后需要哪个控件 在父项目的qrc路径进行导入 即可将控件库里面的控件给导入项目 在使用的时候 使用模…

tomcat中间件漏洞CVE-2017-12615,后台弱口令部署war包,CVE-2020-1938

一.CVE-2017-12615 环境搭建 cd vulhub-master/tomcat/CVE-2017-12615 docker-compose up -d 漏洞复现 http://172.16.1.22 1.⾸⻚抓包&#xff0c;修改为 PUT ⽅式提交 PUT /shell.jsp/ 2.上传成功进行访问&#xff0c;使用Webshell客户端⼯具进⾏连接 二.后台弱口令部…