力扣150题——位运算

news/2024/9/18 20:40:58 标签: leetcode, 算法, 数据结构

位运算概述

位运算(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.niftyadmin.cn/n/5664491.html

相关文章

Threejs之看房案例(下)

本文目录 前言最终效果1、点精灵1.1 添加点精灵1.2 点精灵效果2、添加事件2.1 鼠标移动事件2.1.1 效果2.2 鼠标点击事件2.2.1 效果2.3 切换互通3. 完整代码前言 在Threejs之看房案例(上)这篇博客中我们已经完成了大厅的3d观看效果,但是我们会发现如果想去其他房间观看,没有…

好用的超声波清洗机有哪些?精选四大爆款品牌汇总

随着时代的发展及生活水平的提升&#xff0c;珠宝饰品、眼镜等个人物品日益普及至千家万户。然而&#xff0c;这些贵重小物在日常存放中难免会积累微尘与隐形细菌&#xff0c;无形中可能对我们的健康产生潜在影响。鉴于细菌的微小难察&#xff0c;超声波清洗机应运而生&#xf…

进程监控与管理详解

一、进程的定义: 进程process是正在运行的程序,包括: 分配的内存地址空间 安全属性、包括所有权和特权 一个或多个线程 进程状态 进程的环境包括: 本地和全局变量 当前调度上下文…

【每日一题】LeetCode 815.公交路线(广度优先搜索、数组、哈希表)

【每日一题】LeetCode 815.公交路线&#xff08;广度优先搜索、数组、哈希表&#xff09; 题目描述 给定一个表示公交线路的数组 routes&#xff0c;其中每个 routes[i] 表示第 i 辆公交车的循环行驶路线。现在从 source 车站出发&#xff0c;要前往 target 车站&#xff0c;…

Linux | 进程间通信:管道、消息队列、共享内存与信号量

文章目录 《深入理解进程间通信&#xff1a;管道、消息队列、共享内存与信号量》一、进程间通信介绍&#xff08;一&#xff09;进程间通信目的&#xff08;二&#xff09;进程间通信发展&#xff08;三&#xff09;进程间通信分类 二、管道&#xff08;一&#xff09;什么是管…

C++:字符串string转成整型int

一、atoi atoi 是 C 标准库中的一个函数&#xff0c;全称是 ASCII to Integer&#xff0c;用于将字符串转换为整数。 函数定义 int atoi(const char *str);参数&#xff1a;str 是一个指向以 \0 结尾的字符串的指针。返回值&#xff1a;返回字符串转换后的整数。如果字符串中…

Flutter Android Package调用python

操作步骤 一、创建一个Flutter Package 使用以下指令创建一个Flutter Package flutter create --templateplugin --platformsandroid,ios -a java flutter_package_python 二、修改android/build.gradle文件 在buildscript——>dependencies中添加以下内容 //导入Chaqu…

【2024】前端学习笔记7-颜色-位置-字体设置

学习笔记 1.定义&#xff1a;css2.颜色&#xff1a;color3.字体相关属性&#xff1a;font3.1.字体大小&#xff1a;font-size3.2.字体风格&#xff1a;font - style3.3.字体粗细&#xff1a;font - weight3.4.字体族&#xff1a;font - family 4.位置&#xff1a;text-align 1.…