leetcode-位运算

2023-11-10

 通过位运算取出一个数字的二进制表示的每一位(从末位开始取),比如说:

11=(1011),所以依次取出末位1,然后是1,0,1

public class bit_cal
{
    public static void main(String[] args)
    {
        int x=11;
        while(x!=0)
        {
            int temp=x&1;
            System.out.println(temp);//输出此时二进制表示的最后一位是0还是1
            x=x>>1;//x右移
        }

    }
}
//最后打印输出结果为:1101
//11=1011,所以输出确实应该是1101

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

下面这种方法是最简单的方法,把这个数二进制形式下的最后一位依次取出来

这里的有符号右移和无符号右移的问题参考这个链接>>有符号右移和>>>无符号右移_Pr Young的博客-CSDN博客

public class Solution 
{
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) 
    {

        int result=0;
        while(n!=0)
        {
            if((n&1)!=0)//判断最后一位是否为0,不为0,那就统计结果加1
            {
                result++;
            }
            n=n>>>1;//注意这里用无符号右移,而不是有符号右移
        }
        return result;
    }
}

还有下面的方法也是可以的:

将输进来的数依次和下面32个数进行与操作,结果不为0说明输进来的数这一位是1,结果为0说明输进来的数这一位是0,用一个数count来统计位为1的位数

 左移32次法:

public class Solution
{
    // you need to treat n as an unsigned value
    public int hammingWeight(int n)
    {
        int count=0;

        int m=1;//32个数中的第一个数,0000.....0001

        for(int i=1;i<=32;i++)
        {
            if((n&m)!=0)  count++;
            m=m<<1;//m左移1位           
        }
        return count;
    }
}

当然你也可以不断的将输入的n进行右移一位,和0000.....0001来进行与操作,右移32次法:

public class Solution
{
    // you need to treat n as an unsigned value
    public int hammingWeight(int n)
    {
        int count=0;

        int m=1;
        for(int i=1;i<=32;i++)
        {
            if((n&m)!=0)  count++;
            n=n>>1;//n右移1位           
        }
        return count;
    }
}

解法3:利用性质:n&(n-1),运算结果是把n的二进制表示中的最低位的1变成0:

 利用这个性质,不断的将当前n和n-1进行&操作,直到n变成0,进行了多少次与操作,就说明有多少位的1

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

力扣338 比特位计数 (就是统计0~n中每个数有多少位1)

class Solution 
{
    public int[] countBits(int n) 
    {
        int[] result=new int[n+1];
        for(int i=0;i<=n;i++)
        {
           result[i]=dfs(i);
        }
        return result;
    }
    public int dfs(int k)
    {
        int result=0;
        while(k!=0)
        {
            if((k&1)!=0)//判断最后一位是否为0,不为0,那就统计结果加1
            {
                result++;
            }
            k=k>>>1;
        }
        return result;
    }
}




1231. 2 的幂 - 力扣(LeetCode)

231. 2 的幂 - 力扣(LeetCode)

 判断一个数是否是2的n次方,比如16是,5不是

暴力法:

class Solution 
{
    public boolean isPowerOfTwo(int n) 
    {
        for(int i=0;Math.pow(2,i)<=n;i++)
        {
            if(Math.pow(2,i)==n)   return true;   
        }
        return false;
    }
}

如果一个数m是2的n次方,那么它的二进制表示就是100000,最高位为1,其他位都是0

而m-1的二进制表示就是011111,最高位为0,其他位为1

所以m&m-1=0

class Solution 
{
    public boolean isPowerOfTwo(int n) 
    {
        //提交时发现有两个测试用例0和-2147483648
        //这两个预期都是false,但是我们答案得到的是true
        if(n<=0)   return false;
        return (n&(n-1))==0;   
    }
}

342. 4的幂 - 力扣(LeetCode)

 核心:首先这个数得是2的n次方,其次这个数除以3余数必须为1,那么这个数就是4的幂

class Solution
{
    public boolean isPowerOfFour(int n) 
    {
        return ((n&(n-1))==0)&&(n%3==1);
    }
}


面试题 16.01. 交换数字 - 力扣(LeetCode)

不使用中间变量交换两个数字

 

class Solution
 {
    public int[] swapNumbers(int[] numbers) 
    {

        numbers[0] = numbers[0] ^ numbers[1];
        numbers[1] = numbers[0] ^ numbers[1];
        numbers[0] = numbers[0] ^ numbers[1];
        return numbers;
    }
}

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

数组中只出现一次的数(其他数都出现两次)

利用性质:(1)任何数和自己做异或(异为1,同为0),结果都为0

                  (2)0和任何数做异或,结果为本身

class Solution 
{
    public int singleNonDuplicate(int[] nums)
    {
        int result=0;
        for(int num:nums)
        {
            result=result^num;
        }
        return result;
    }
}

461. 汉明距离 - 力扣(LeetCode)

也就是说先将两个数进行异或运算,然后就是上卖那道题目了:求位1的个数

class Solution
 {
    public int hammingDistance(int x, int y) 
    {
        //先求出x^y,即x和y做异或运算就可以求出这两个数之间有多少位不一样了

        //然后看结果中有几位1就知道汉明距离是多少了
        //那怎么看一个数的二进制表示里面有几个1呢?x=x&(x-1)看几次x才能变为0
        int temp=x^y;
        int result=0;
        while(temp!=0)
        {
            result++;
            temp=temp&(temp-1);
        }
        return result;
    }
}

力扣剑指offer65   不用加号 通过位运算实现两数相加

力扣371两整数之和也是一样的题目

(1)异或就是不进位相加

(2) 那进位信息怎么求呢?求与,然后再向左移动一位

 所以:不进位相加(异或)+进位信息(与操作然后向左移一位

 

class Solution
{
    public int add(int a,int b)
    {
        int temp1=0;//记录异或的结果
        int temp2=0;//记录与然后左移一位的结果
        
        while (b != 0)//与的结果为0就跳出循环
        {
            temp1 = a ^ b;
            temp2 = (a & b) << 1;
            a = temp1;
            b = temp2;
        }
        //最后返回的是异或的结果
        return  a;
    }
}

 不用加号 通过位运算实现两数相减

 减法a-b,就是a加上b的相反数

一个数的相反数怎么求,这个数取反加1就是这个数的相反数

class Solution
{
    public int add(int a,int b)
    {
        b=~b+1;
        int temp1=0;//记录异或的结果
        int temp2=0;//记录与然后左移一位的结果
        
        while (b != 0)//与的结果为0就跳出循环
        {
            temp1 = a ^ b;
            temp2 = (a & b) << 1;
            a = temp1;
            b = temp2;
        }
        //最后返回的是异或的结果
        return  a;
    }
}

不用乘号,通过位运算实现两数两乘

 ​​​​​​​

 

 

class Solution
{
   public   int   multi(int a,int b)
   {
         int  result=0;
         
         while(b!=0)
         {
              if(b&1)!=0
              {


         }

   }


}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode-位运算 的相关文章

  • eMMC简介

    eMMC是embedded MultiMediaCard的简称 MultiMediaCard 即MMC 是一种闪存卡 Flash Memory Card 标准 它定义了MMC的架构以及访问Flash Memory的接口和协议 而eMMC则是
  • 全屏dialog

    下面是iOS里面做全屏Dialog的代码 调用show时Dialog会覆盖当前的controller 全屏显示 可以用来做蒙板效果 欢迎转载 转载请注明出处 http blog csdn net tadican article detail
  • Python中的装饰器是什么?装饰器是如何工作的?

    Python很早就引入了装饰器 在PEP 318中 作为一种简化函数和方法定义方式的机制 这些函数和方法在初始定义之后必须进行修改 这样做的最初动机之一是 使用classmethod和staticmethod等函数来转换方法的原始定义 但是
  • hibernate映射继承关系(一):一张表对应一整棵类继承树

    翻译 hibernate映射继承关系 一 一张表对应一整棵类继承树 2人收藏此文章 我要收藏发表于1年前 2012 05 22 16 34 已有 482次阅读 共 0个评论 英文原址 网上这个主题的文章不在少数 这个系列的文章的部分价值在于

随机推荐

  • 【100%通过率 】【华为OD机试 c++】最多等和不相交连续子序列【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 最多等和不相交连续子序列 给定一个数组 我们称其中连续的元素为连续子序列 称这些元素的和为连续子序列的和 数组中可能存在几组连续子序列 组内的连
  • NexT主题进阶

    NexT 是 Hexo 框架中最为流行的主题之一 精于心 简于形 NexT 支持多种常见第三方服务 使用 第三方服务 来扩展站点的功能 除了 Markdown 支持的语法之外 NexT 借助 Hexo 提供的 tag 插件 为您提供在书写文
  • EDK2安装教程

    1 1基础搭建 相关文件请自行百度下载 1 安装VS2015到C盘 请勿修改默认目录 否则需要修改C edk2 Conf tools def txt 2 如安装包所示 安装python2 7到C盘并设置环境变量如下 3 将nasm解压到C
  • JavaScript-二分法详解

    文章目录 二分法 二分查找 非递归实现 二分查找 递归实现 二分排序 复杂度分析 推荐文章 经典例题 力扣习题 二分法 二分法又可以被称为二分查找 它描述了在有序集合中搜索特定值的过程 广义的二分查找是将问题的规模尽可能的缩小到原有的一半
  • win10,创建新环境并安装pytorch-gpu=1.7.0版本

    之前装过gpu版本tensorflow 包含cudatoolkit 10 1 创建新环境装gpu版本pytorch时考虑是否再装cudatoolkit 以下是没有再装cudatoolkit情况下 目前正常 文章目录 Anaconda 创建新
  • 图注意力网络(Graph Attention Network, GAT) 模型解读与代码实现(tensorflow2.0)

    前面的文章 我们讲解了图神经网络三剑客GCN GraphSAGE GAT中的两个 图卷积神经网络 GCN 理解与tensorflow2 0代码实现 GraphSAGE 模型解读与tensorflow2 0代码实现 本要讲的是GAT Grap
  • 解决Intellij IDEA maven 自动设置JDK为JDK1.5

    在idea中创建maven项目 每次更新或重新载入maven项目后 都会重新变成JDK1 5 就算手动设置maven项目或者模块JDK1 8 刷新后还是会变为JDK1 5 这是由于创建项目时没有指定jdk版本 而maven的默认jdk版本为
  • Oracle instr函数和sign函数详解

    1 instr 函数 俗称 字符查找函数 格式一 instr string1 string2 instr 源字符串 目标字符串 格式二 instr string1 string2 start position nth appearance
  • 目标检测YOLO实战应用案例100讲-基于改进YOLOv5的口罩人脸检测

    目录 前言 国内外研究现状 目标检测研究发展 国内外口罩人脸检测研究现状
  • Spring Swagger在nginx 二级url 无法正常使用问题解决

    问题描述 测试环境用了nginx做二级url做映射 但swagger的 http www xxx com 二级url v2 JSON里面的host地址还是一级目录 不自动对应nginx做了映射的二级url 因此使用swagger ui ht
  • CENTOS 下service network restart失败最全解决方案

    经常会有人在centOS 7下更改完静态ip后发现network服务重启不了 翻遍了网络 尝试了各种方法 终于解决了 现把各种解决方法归纳整理 希望能让大家少走点歪路 首先看问题 执行service network restart命令后出现
  • 五个温度带的分界线_寒带与温带的分界线是什么啊

    寒带与温带的分界线是什么啊2020 06 01 09 19 44文 钟诗贺 温带与寒带的分界线是 极圈 纬度 66 5 度 地球五带中 热带与温带的分界线是回归线 南北回归线 纬度是23 5度 南北纬23 5度 温带与寒带的分界线是极圈 南
  • 【ISP】光圈、焦距与景深的关系

    最直接的图 1 弥散圆 在焦点前后 光线开始聚集和扩散 点的影象变成模糊的 形成一个扩大的圆 这个圆就叫做弥散圆 现实当中 观赏拍摄的影象是以某种方式 比如投影 放大成照片等等 来观察的 人的肉眼所感受到的影象与放大倍率 投影距离及观看距离
  • ChatGPT4使用体验

    GPT火了很久 被各种媒体吹上了天 但是因为工作原因 一直没有机会去真正的尝试 最近终于有了一天的空闲时间 就想着好好看看GPT当前到底能干啥 如下是我针对不同类别 分别提出不同问题 GPT给的回答 如果有兴趣可以看看 1 定性问题 对于一
  • pandas.read_csv参数详解

    pandas read csv参数整理 读取CSV 逗号分割 文件到DataFrame 也支持文件的部分导入和选择迭代 更多帮助参见 http pandas pydata org pandas docs stable io html 参数
  • 带你学习STM32f1之蓝牙控制LED(简单入手,含主代码)

    目录 前言 一 蓝牙模块简介 二 代码部分详解 三 总结 题外话 前言 这次博文还是主要以STM32f103zet6小系统板来操作 依旧使用库函数入手 寄存器版本可能要到后续再做更新 因为我才刚开始入手寄存器不久 不是很熟练 还在熟悉哈哈
  • anaconda的python环境变量_装了anaconda之后如何设置anaconda、python环境变量

    装了anaconda之后如何设置anaconda python环境变量 1 装了anaconda之后如何设置anaconda环境变量 参考 https www cnblogs com avivi p 10282366 html 后面部分 2
  • python search group_python笔记52-re正则匹配search(group groups groupdict)

    前言 re search扫描整个字符串并返回第一个成功的匹配 re findall返回字符串中所有不重叠匹配项的列表 如果没有匹配到返回空list不会报错 search匹配对象有3个方法 group groups groupdict 这3个
  • BFS模板

    st u 1 标记 bfs u queue
  • leetcode-位运算

    通过位运算取出一个数字的二进制表示的每一位 从末位开始取 比如说 11 1011 所以依次取出末位1 然后是1 0 1 public class bit cal public static void main String args int