深入了解Java位运算符

news2024/11/19 8:32:28

1.前言

        位运算在我们刷题时候,对于效率和空间都是很大的提升,所以位运算符,对于我们的作用也是不可或缺的。

 里面就存在一个很重要的思想就是位图,此次我讲解位运算符的作用主要是为他服务的

位图的原理:通过一个整数模拟,四个字节三十二个比特位的数组就形成了,这种做可以在时间复杂度为O(1)的情况下使用hash表来解答问题。而你所进行的位数相加减,我将在下面介绍、

2.介绍概念 

  1. 按位与(&):将两个操作数的对应位进行逻辑与运算,相同位置上的位都为1时,结果为1,否则为0。
  2. 按位或(|):将两个操作数的对应位进行逻辑或运算,相同位置上的位只要有一个为1,结果即为1。
  3. 按位异或(^):将两个操作数的对应位进行逻辑异或运算,相同位置上的位不同时,结果为1,否则为0。
  4. 按位取反(~):对操作数的每个位进行取反操作,即0变为1,1变为0。

此外,还有一些位移运算符:

  1. 左移(<<):将一个操作数的所有位向左移动指定的位数,右侧空出的位用0填充。
  2. 有符号右移(>>):将一个操作数的所有位向右移动指定的位数,移位后左侧空出的位用符号位填充,即正数用0填充,负数用1填充。
  3. 无符号右移(>>>):将一个操作数的所有位向右移动指定的位数,移位后左侧空出的位用0填充,不考虑符号位。

下面我来介绍一下,我对位运算的记忆方式吧!!!!

 1.按位与(&):有 0 就是 0

 2 .按位或(|) :  有1 就是 1 

 3 .按位异或(^): 同为 0 异为 1 (也可以记成 无进位相加)

 4.按位取反(~):0 变 1   1变0

下面也有一些注意事项: 

位运算符只适用于整数类型(byte、short、int、long)和char类型,不适用于浮点数类型(float、double)和布尔类型(boolean)。

3.位运算符的作用

3.1. 异或(^)符的运算律

3.1.1.无进位相加

因为^同为0嘛,所以说 0 + 0 = 0    1 + 1 = 0    1 +  0 = 1  所以就实现了无进位相加

我在后面还会介绍一下,不用+怎么实现两数相加来介绍这个概念

3.1.2.消消乐

消消乐概念:就是n ^ n = 0   0 ^ n = 0 

3.1.3.  交换律和结合律

 a ^ b ^ c = a ^ ( b ^ c  )

原理分析:

这个原理还是根据3.1.1无进位相加,  0 + 0 = 0    1 + 1 = 0    1 +  0 = 1 本质就是在做 1 的抵消。所以在加的时候任意抵消1

然后我推荐几道题可以使用此知识点解决

 力扣   136.只出现一次的数字

               

            260.只出现一次的数字III

3.2.判断第x位为 0 还是 1 

n = (n >> x)& 1 

为什么是这样呢,我将在下面介绍原理:

右移后就是把你要判断的位置,移动到了最后一位,此时与 1 就相当于其他位置清0(&有0则0,1除了最后一位全是0),最后一位是1答案是1   是0答案是0

3.3.将第x位修改成1

n = n | (1 << x)

此时1左移x位就像等于和你修改的位置对齐了,此时 或 1  就是其他位置不变(1<<x就是此时除了x位置是1其他均为0,|有1则1,遇0不变),只有第x位,无论是什么都会变成1.

3.4. 将第x位修改成0

n = n & n (~(1 << x))

这个的原理就跟上述的类似:此时取反就是让x位置变成0其余位置变成1,然后进行 按位与的时候第x位会变成0(因为有0则0嘛)

3.5.位图的思想 

注意这个才是重中之重,前面之所以引出这么多概念,都是为了这个概念模型服务的。

位图的本质:就是一个hash表,只不过现在用比特位代替数组,让每一个比特位(0 1)来记录我们信息,所以就可以使用一个整数来实现我们的增删查改。

 

为什么说上面都是为了位图而服务的呢?

因为我们如果这样模拟hash表,我们就需要经常看看你某一位存的是0还是1,我想修改你我怎么操作 

在最后我会通过一道题,来加深大家对位图的理解。

3.6.提取最低位的1 (lowbite)

n  & -n 

主要思想就是 & -n (会将最后一个1右边的部分全部变成相反,左边不变)

又因为& 有0则0 右边全是相反代表必有一个0 ,所以全变成0了

3.7.干掉最右侧的1 

n  & (n - 1) 

主要思想就是 & -n (会将最后一个1和它左边的部分全部变成相反,右边不变)

又因为& 有0则0 左边全是相反代表必有一个0 ,所以全变成0了,就把最后一个1干掉了

 

 4.例题分析

4.1位运算符实现相加

       这一题的主要思路:就是(a & b) << 1实现进位,来弥补^ 的无进位相加

 public static int add(int a, int b) {
        while (b != 0) {
            int carry = (a & b) << 1;   // 进位
            a = a ^ b;                  // 加法
            b = carry;                  // 迭代
        }
        return a;
    }

4.2判断字符是否为1

我在下面先介绍hash表怎么解答的在书写位图的代码,大家自行对比,因为位图空间复杂度为O(1).

 hash表实现

 //解法一:hash表
    public boolean isUnique1(String str) {
        if(str.length() > 26){ // 利用鸽巢原理来做优化
            return false;
        }
        int[] hash = new int[26];//创建一个hash表用来存储字符
        char[] charArray = str.toCharArray();
        for (char c : charArray) {//添加字符
            if (hash[c - 'a'] != 0){
                return false;
            }else {
                hash[c - 'a']++;
            }
        }
        return true;
    }

 位图实现

 //解法二:利用位图
    public boolean isUnique(String str) {
        if (str.length() > 26) { // 字符串超过26必为false
            return false;
        }
        int hash = 0;//利用位图模拟hash表
        char[] charArray = str.toCharArray();
        for (char c : charArray) {//添加字符
            int index = c - 'a';//位图要存的索引
            if ((hash & (1 << index)) != 0){
                return false;
            }else {
                hash |= (1 << index);
            }
        }
        return true;
    }

后面的就不一一介绍了,推荐几道题

191.位1的个数

338、比特位计教

461、汉明距离

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

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

相关文章

Dubbo的整体框架和主要模块

1 整体框架 Dubbo的整体框架如下图所示&#xff1a; 上层依赖下层提供的功能&#xff0c;下层的改变对上层不可见。 2 主要模块 &#xff08;1&#xff09;主要模块如下所示&#xff1a; &#xff08;2&#xff09;各子模块描述如下所示&#xff1a; 3 参考文献 &#xff08…

CN论文编写提示词-示例

建议用GPT-4或者Bing 现在开始你是一位计算机学科的研究员!教授!擅长研究和撰写论文!我需要你协助我一起研究一个课题:《计算机信息技术在智能交通系统中的应用》!你认为这个题目如何!有哪些参考资料!这个题目作为论文题目的话有哪些创新意义和价值! 你扮演计算机信息技…

第六章 应用层 | 计算机网络(谢希仁 第八版)

文章目录 第六章 应用层6.1 域名系统DNS6.1.1 域名系统概述6.1.2 互联网的域名结构6.1.3 域名服务器 6.2 文件传送协议6.2.1 FTP概述6.2.2 FTP的基本工作原理6.2.3 简单文件传送协议TFTP 6.3 远程终端协议TELNET6.4 万维网www6.4.1 万维网概述6.4.2 统一资源定位符URL6.4.3 超文…

VBA技术资料MF70:从单元格文本中取消或删除上标

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

力扣刷题 day46:10-16

1.最大整除子集 给你一个由 无重复 正整数组成的集合 nums &#xff0c;请你找出并返回其中最大的整除子集 answer &#xff0c;子集中每一元素对 (answer[i], answer[j]) 都应当满足&#xff1a; answer[i] % answer[j] 0 &#xff0c;或 answer[j] % answer[i] 0 如果存在…

2.SpringSecurity - 处理器简单说明

文章目录 SpringSecurity 返回json一、登录成功处理器1.1 统一响应类HttpResult1.2 登录成功处理器1.3 配置登录成功处理器1.4 登录 二、登录失败处理器2.1 登录失败处理器2.2 配置登录失败处理器2.3 登录 三、退出成功处理器3.1 退出成功处理器3.2 配置退出成功处理器3.3 退出…

前端需要了解的浏览器缓存知识

文章目录 前言为什么需要缓存&#xff1f;DNS缓存缓存读写顺序缓存位置memory cache&#xff08;浏览器本地缓存&#xff09;disk cache&#xff08;硬盘缓存&#xff09;重点&#xff01;&#xff01;&#xff01; 缓存策略 - 强缓存和协商缓存1&#xff09;强缓存ExpiresCach…

认识测试---什么是测试?

文章目录 测试软件测试的性质测试人员的基本素养什么是需求什么是BUG 开发模型和测试模型软件的生命周期开发模型瀑布模型螺旋模型增加&#xff0c;迭代敏捷开发scrume 测试模型V模型W模型&#xff08;双V模型&#xff09; 测试 一个好的开发者&#xff0c;不仅要懂技术也要懂…

【cpu_entry_area mapping】SCTF2023-sycrop

前言 也算学习到了&#xff0c;这样对 DB_stack 的利用与 pt_regs 很相似。都是利用在用户态切换在内核态时&#xff0c;会保存用户态的上下文信息在内核栈中&#xff0c;所以我们就可以控制部分内核栈中的数据&#xff0c;以此为我们栈迁移做好准备。 程序分析 启动脚本啥的…

14-k8s-基本存储之EmptyDir、HostPath、NFS

文章目录 一、相关概念二、EmptyDir存储三、HostPath存储四、NFS存储 一、相关概念 概述 Volumn定义在Pod上&#xff0c;然后被该Pod里面的多个容器挂载到具体的文件目录下。实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命周期不和Pod中的单个容器的…

出海 SaaS 企业增长修炼手册:聊聊 PLG 的关键指标、技术栈和挑战

产品驱动增长 Product-Led Growth (PLG) 近几年可谓火遍海外 SaaS 圈&#xff0c;但想要真正落地 PLG 还是存在不少挑战的。了解 PLG 背后的增长指标&#xff0c;不仅可以帮助企业跟上发展节奏&#xff0c;更能从纷繁复杂的业务细节中获取有价值洞察。那么&#xff0c;如何高效…

【3】c++11新特性(稳定性和兼容性)—>类成员的快速初始化

在进行类成员变量初始化的时候&#xff0c;C11标准对于C98做了补充&#xff0c;允许在定义类的时候在类的内部直接对非静态变量进行初始化&#xff0c;在初始化的时候可以使用等号&#xff0c;也可以使用花括号{}&#xff0c;等号可以省略不写&#xff1b;静态成员变量需要在类…

二叉树的三种遍历方式的本质

二叉树的定义就不在这里多说了&#xff0c;下面这个图就是一个简单的二叉树&#xff1a; 二叉树的三种遍历方式&#xff1a; 前序遍历&#xff1a;头左右&#xff0c;也就是先头后左再右&#xff1a;1245367 public static void prePrint(BinaryTreeNode root) {if (root ! n…

pycharm社区版创建Django项目的一种方式

pycharm社区版创建Django项目 pycharm创建New project安装django&#xff0c;如果安装过可略过安装完成后查看安装情况生成Django项目需要的文件这里注意生成语句后面的 . 不可以省略 生成文件后&#xff0c;框架搭建完成&#xff0c;配置启动我这里在配置完后&#xff0c;报了…

徐建鸿:深耕中医康养的“托钵行者”

为什么是“庄人堂”&#xff1f;杭州“庄人堂”医药科技公司董事长徐建鸿很乐意和别人分享这个名称的由来&#xff0c;一方面是庄子首先提出“养生”这个概念&#xff0c;接近上工治未病的上医&#xff0c;取名“庄人堂”代表庄子门生&#xff0c;向古哲先贤致敬&#xff01;另…

vscode使用code runner乱码

"code-runner.executorMap": {"python": "set PYTHONIOENCODINGutf8 && python $fullFileName"}

unordered_set unordered_map 的封装

目录 1. 哈希的概念 1.1. 哈希冲突 1.2. 哈希函数&#xff1a; 1. 直接定址法 2. 除留余数法 1.3. 闭散列实现哈希 1.4. 开散列实现哈希 2. 哈希的应用 2.1 位图的概念 2.1.1. 问题&#xff1a; 2.2.1. set ​编辑 2.2.2. reset 2.2.3. test() 2.2. 位图的实现…

软件工程与计算总结(十五)详细设计中面向对象方法下的信息隐藏

软件工程与计算总结&#xff08;十三&#xff09;详细设计中的模块化与信息隐藏 之前的博客中&#xff0c;模块需要隐藏的决策主要由“职责的实现”and“实现的变更”两类&#xff0c;在面向对象方法中&#xff0c;需要做到的就是&#xff1a; 封装类的职责&#xff0c;隐藏职…

MyBatisPlus(十九)自动填充

说明 自动填充指的是&#xff0c;当数据被 插入 或者 更新 的时候&#xff0c;会为指定字段进行一些默认的数据填充。 比如&#xff0c;插入时&#xff0c;会自动填充数据的创建时间和更新时间&#xff1b;更新时&#xff0c;会自动填充数据的更新时间。 实现方式 配置处理器…

python--短路运算,把0、空字符串和None看成 False,其他数值和非空字符串都看成 True

代码 print(3 and 4 and 5) # 5 print(5 and 6 or 7) # 6 4 > 3 and print(‘hello world’) # 输出hello world 注释&#xff1a; 在逻辑运算中&#xff0c;不一定逻辑运算符的两边都是纯表达式。也可以是数值类型的数据。 Python把0、空字符串和None看成 False&#xff…