本文已收录于专栏🌸《Java入门一百例》🌸

学习指引

序、专栏前言

   本专栏开启,目的在于帮助大家更好的掌握学习​​Java​​​,特别是一些​​Java学习者​​难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。
   但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
   算法的学习肯定不能缺少总结,这里我推荐大家可以到​​​高校算法社区​​​将学过的知识进行打卡,以此来进行巩固以及复习。
  学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。

一、位或运算

  • 【第33天】或运算 | 的使用 | 连续低位0变1_开发语言位或运算符是​​​|​​​,和上节课学习的​​&​​​运算一样,它也是一个二元运算符,表示为​​x | y​​。
  • 【第33天】或运算 | 的使用 | 连续低位0变1_java_02​​​|​​​运算同样是对二进制进行运算,二进制只有​​0​​​和​​1​​​,所以可能出现的组合的情况只有【第33天】或运算 | 的使用 | 连续低位0变1_leetcode_03种,我们同样将其写成表格形式

x

y

结果

1

1

1

1

0

1

0

1

1

0

0

0

  • 我们仔细对比表格可以很明显发现规律
  • 【第33天】或运算 | 的使用 | 连续低位0变1_开发语言只要当​​​x​​​或​​y​​​有一者为​​1​​​,则答案为​​1​​​,也可理解无论​​1​​​还是​​0​​​,位或上​​1​​​均为​​1​​。
  • 【第33天】或运算 | 的使用 | 连续低位0变1_java_02只有当两个操作数都是​​​0​​​的时候,答案才为​​0​​。
  • 【第33天】或运算 | 的使用 | 连续低位0变1_蓝桥杯_06可以与​​​&​​​运算进行对比,​​&​​​运算只有两操作数均为​​1​​​时才为​​1​​。
public class Main{
public static void main(String[] args) {
int a=0b10101;
int b=0b01010;
System.out.println(a|b);
}
}
  • 【第33天】或运算 | 的使用 | 连续低位0变1_开发语言在​​​Java​​​中,以​​0b​​​开头,表示这是一个二进制串,​​a​​​的实际值为【第33天】或运算 | 的使用 | 连续低位0变1_算法_08,​​​b​​​的值为【第33天】或运算 | 的使用 | 连续低位0变1_蓝桥杯_09
  • 【第33天】或运算 | 的使用 | 连续低位0变1_java_02此时​​​|​​​运算,会对​​a​​​和​​b​​​的每一位进行运算,​​b​​​的前导​​0​​可去掉,这里是为了形成对照
  • 【第33天】或运算 | 的使用 | 连续低位0变1_蓝桥杯_06最终根据规则课得到【第33天】或运算 | 的使用 | 连续低位0变1_leetcode_12,转换为十进制的结果为​​​31​​。

二、位运算的运用

1.某位变1

给定一个正整数 【第33天】或运算 | 的使用 | 连续低位0变1_leetcode_13,判断它二进制低位的第【第33天】或运算 | 的使用 | 连续低位0变1_算法_14位是否为​​​0​​​,如果是则让它变​​1​​,输出改变后的值。

  • 问题的思路很简单,就是直接把地位的第​​5​​​位变为​​1​​​,这样我们很容易联想到​​|​​​,因为任何数​​|​​​上​​1​​​均得到​​1​​​,通过这个操作我们可以让某个数的任何一位变为​​1​​。
import java.util.Scanner;

public class TextEditor {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int x=sc.nextInt();
System.out.println(x|(0b10000));
}
}

2.低位连续0变1

给定一个正整数【第33天】或运算 | 的使用 | 连续低位0变1_leetcode_13,将它低位连续的​​​0​​​都变为​​1​​。

假设给定的整数低位有连续【第33天】或运算 | 的使用 | 连续低位0变1_leetcode_16个​​​0​​​,二进制表示如下:
【第33天】或运算 | 的使用 | 连续低位0变1_java_17
很容易联想到,如果我们将其减去​​​1​​​,得到的数为
【第33天】或运算 | 的使用 | 连续低位0变1_算法_18
这时又能发现,如果对两个数进行​​​|​​​运算,就能得到
【第33天】或运算 | 的使用 | 连续低位0变1_java_19
这样即可达到题目要求

import java.util.Scanner;

public class TextEditor {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int x=sc.nextInt();
System.out.println(x|(x-1));
}
}

【第33天】或运算 | 的使用 | 连续低位0变1_开发语言_20

三、推荐专栏


🌌《零基础学算法100天》🌌


四、课后习题

序号

题目链接

难度评级

1

​ 按位与结果大于0的最长组合​

2

👇 学习有疑问?👇