一起学算法(位运算篇)

news2024/9/20 9:43:24

1.位运算

1.二进制数值表示

       在计算机中,我们可以用单纯的0和1来表示数字,一般不产生歧义,我们会在数字的右下角写上它的进制,例如:1010(10)其表示的是1010,1010(2)表示的是10

2.二进制加法

二进制加法采用的是从低到高的位次相加,当相加的和为2时,则向高位进位

例如:

 3.二进制的减法

二进制减法采用从低到高的位次依次相减,当遇到0减1的情况,则向高位借位

例如:

 2.位运算简介

 3.位运算概括

1.布尔运算

运算符表示含义示例
&位与x&y
|位或x|y
^异或x^y
~按位取反x~y

1.位与(一假便假)

左操作数右操作数结果
000
010
100
111
   public static void main(String[] args) {
        int a=110;
        int b=0b110;
        System.out.println(a);//110
        System.out.println(b);//6
    }
  • 以0b作为前缀的表示它是一个二进制数
位与运算符的应用:
1.奇偶性判定

一般我们判断奇偶数的时候,都是取模进行判断

    int a=15;
        if(a%2==0){
            System.out.println("我是一个偶数");
        }else{
            System.out.println("我是一个奇数");
        }
我们学了位运算之后就可以这样写
  int a=15;
        if((a&1)==0){
            System.out.println("我是一个偶数");
        }else{
            System.out.println("我是一个奇数");
        }
这是因为在二进制中奇数的最后一位是1,偶数的最后一位是0,故&可以求得该数奇偶性
2.取末5位

给定一个数,求它的二进制表示的末5位,以十进制输出即可

可以给 给定的数位与个0b11111,取到末5位的值

x&0b11111
3.消除末尾5位

给定一个数32位的整数,要求消除它的末5位

(11111111111111111111111111100000)(2)

代码这么写确实是复杂,看到都有点头晕,一般我们把它转成16进制,每4个二进制可以转换为一个16进制的数,所以得到的16位进制的数为0xffffffe0

x&0xffffffe0
//f代表的是4个1  e代表的是3个1,1个0   0代表的是4个0
4.消除末尾连续1

给出一个整数,现要求将这个整数转换成二进制数,将末尾连续的1都变为0,输出改变后的数字

  • 原二进制表示形式:

  •  如果我们给这个原二进制数字上末尾加个1:

  •  然后将这两个数进行位与运算:

5.2的幂判定

怎么样才能判断一个正数是不是2的幂次?

  • 如果一个数是2的幂次,它的二进制表示必然是:

  •  我们将它减1,即2的k次减1的二进制表示如下:

  •  于是这两个数位与的结果也为0,于是我们知道一个数x是2的幂次,那么x&(x-1)必然为0
  • (x&(x-1))==0

2.位或(一真便真)

左操作数右操作数结果
000
011
101
111
1.位或运算符的应用
1.设置标记位

给定一个数,判断它二进制低位的第5位,如果是0,则将它置为1

x|0b10000
2.置空标记位
  • 首先,强行将低位的第5位换成1
  • 然后,强行将低位的第5位去掉
int a=0b10000
((x|a)-a)
注意:直接减是不行的,因为我们要保证那一位为1,不然会造成借位,影响结果
3.低位连续零变一

给定一个整数x,将它低位连续的0都变为1

  • 假设这个整数低位有连续k个零,二进制表示为:

  •  减一操作得:

  •  两数进行位或操作:

x|(x-1)
4.低位首零变一

3.异或(相同为0,不同为1)

左操作数右操作数结果
000
011
101
110
1.异或运算符的应用
1.标记位取反

给定一个数,将它的低位数起的第4位进行取反,0变1  1变0

x^0b10000
2.变量交换

给定两个数,用异或运算交换它们的值

 int a=5;
     int b=15;
     a=a^b;
     b=a^b;
     a=a^b;
     System.out.println(a);//15
     System.out.println(b);//5
3.出现奇数次的数

输入n个数,其中只有一个数出现了奇数次,其他所有数都出现了偶数次,求这个出现了奇数次的数

根据异或的性质,两个一样的数异或结果为0,也就是所有出现偶数次的数异或为0,那么把n个数都异或一下,得到的数一定是那个出现奇数的数

int[] num={2,2,3,4,4,5,5};
         int ans=0;
         for(int n:num){
             ans^=n;
         }
        System.out.println(ans);
4.丢失的数

如果两个相同的数异或为零,那么这个数中,处了丢失的数之外,其余的数都可以找到两两结对异或得零,最后的结果就是0和丢失的数异或,因为0和任何数异或都是这个数的本身,自然地到了丢失的数

5.简单加密

基于两个数异或为0,任何数和零异或为其本身这两个特点,异或还可以用来做简单的加密,将明文异或上一个固定的数变成密文后,可以通过继续异或上这个数,再将密文转成明文

4.按位取反

0变1  1变0

2.移位位运算

运算符表示含义示例
<<左移x<<y
>>右移x>>y

1.左移:

其中x<<y代表将二进制的x的末尾添加y个0,向左移动了y位  1011<<3 =1011000

2.右移:

其中x>>y代表将二进制的x的右边截掉y个0,向右移动了y位  101111>>3 =101

4.将一个hash表压缩成一个数字(只是适用于元素较少的hash表)

空集  -------0
只含有第i个元素的集合{i}---------1<<i
含有全部n个元素的集合{0,1,...,n-1}-------(1<<n)-1
判断第i个元素是否属于集合S-------------if(S>>1&1)
向集合S中加入第i个元素--------------S|1<<i;
从集合S中取出第i个元素--------------S&~(1<<i)   S^(1<<i)
集合S和T的并集------------S|T
集合S和T的交集------------S&T

leetcode题单:

位1的个数

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

只出现一次的数字

    public int singleNumber(int[] nums) {
                if(nums.length==0){
            return 0;
        }
        Arrays.sort(nums);
        Stack stack=new Stack();
        for (int i = 0; i<=nums.length-1; i++) {
            stack.push(nums[i]);
            if(stack.peek().equals(nums[nums.length-1])){
                return (int)stack.peek();
            }
            if(stack.peek().equals(nums[i+1])){
                stack.pop();
                i++;
            }else{
                return (int)stack.peek();
            }


        }
       return (int)stack.peek();
    }

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

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

相关文章

职工管理系统C++

1、管理系统需求 职工管理系统可以用来管理公司内所有员工的信息 本教程主要利用C来实现一个基于多态的职工管理系统 公司中职工分为三类&#xff1a;普通员工、经理、老板&#xff0c;显示信息时&#xff0c;需要显示职工编号、职工姓名、职工岗位、以及职责 普通员工职责…

一文了解JavaScript 与 TypeScript的区别

TypeScript 和 JavaScript 是两种互补的技术&#xff0c;共同推动前端和后端开发。在本文中&#xff0c;我们将带您快速了解JavaScript 与 TypeScript的区别。 一、TypeScript 和 JavaScript 之间的区别 JavaScript 和 TypeScript 看起来非常相似&#xff0c;但有一个重要的区…

CASAIM自动化平面度检测设备3D扫描零部件形位公差尺寸测量

平面度是表面形状的度量&#xff0c;指示沿该表面的所有点是否在同一平面中&#xff0c;当两个表面需要连接在一起形成紧密连接时&#xff0c;平面度检测至关重要。 CASAIM自动化平面度检测设备通过搭载领先的激光三维测头和智能检测软件自动获取零部件高质量测量数据&#xf…

Vue 入门(一)

一、注意 Vue 不支持 IE8 及以下的版本&#xff0c;因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性&#xff0c;但它支持所有兼容 ECMAScript 5 的浏览器。 二、创建 Hello Vue Vue.js 的核心是实现了 MVVM 模式&#xff0c;它扮演的角色就是 ViewModel 层&#xff0c;那么…

STM32使用HAL库中外设初始化MSP回调机制及中断回调机制详解

STM32使用HAL库之Msp回调函数 1.问题提出 在STM32的HAL库使用中&#xff0c;会发现库函数大都被设计成了一对&#xff1a; HAL_PPP/PPPP_Init HAL_PPP/PPPP_MspInit 而且HAL_PPP/PPPP_MspInit函数的defination前面还会有__weak关键字 上面的PPP/PPPP代表常见外设的名称为…

Vue配置代理(解决跨域请求)

app.vue <template><div><button click"getStudents">获取学生信息</button><button click"getCars">获取汽车信息</button></div></template><script> import axios from axios export default {…

2.4g遥控卧室床头氛围灯开发方案

台灯作为我们日常生活的照明工具&#xff0c;不但给我们的生活提供了很大的便利&#xff0c;而且也丰富了我们的世界。随着电子产品的快速发展&#xff0c;家用电器逐渐趋向智能化&#xff0c;台灯也更加智能。智能台灯以2.4g合封芯片为主控芯片&#xff0c;实现遥控器控制台灯…

依托大数据信息技术构建智慧水务系统,推动城市供水快速发展

随着城市化进程的步伐大大变快&#xff0c;城市建设与科学信息技术的融合程度也在不断提升&#xff0c;尤其是大数据信息技术的迅猛发展&#xff0c;为民生工程由信息化向智能化转型提供了条件。以城市的水务系统为例&#xff0c;依托大数据信息技术构建智慧水务系统是智慧城市…

bigemap工程工程行业应用

客户目前主要是需求为使用下载卫星图、等高线、水系、路网等等元素数据做线路规划图 其他信息 客户需要的图中还包含一些农作物以及需要在软件上标注带有箭头的线段&#xff08;不能满足&#xff09; 如下图&#xff1a; 使用场景&#xff1a; 目前主要为制图、规划线路等等…

【mysql】—— 数据类型详解

序言&#xff1a; 本期我将大家认识关于 mysql 数据库中的基本数据类型的学习。通过本篇文章&#xff0c;我相信大家对mysql 数据类型的理解都会更加深刻。 目录 &#xff08;一&#xff09;数据类型分类 &#xff08;二&#xff09;数值类型 1、tinyint类型 2、bit类型 …

Cilium系列-9-主机路由切换为基于 BPF 的模式

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于: 启用本地路由(Native Routing)完全替换 KubeProx…

Godot在多边形内随机获取点

前言&#xff1a; 我做了一个随机生成器&#xff0c;可以生成游戏道具&#xff0c;之前是矩形比较好算&#xff0c;随着关卡设计我需要多边形的生成方式。 在矩形内获取随机点&#xff1a; func generateRandomCoordinateInRect(pos,size):"""根据范围生成随机…

Reinforcement-Learning

文章目录 Reinforcement-Learning1. RL方法分类汇总&#xff1a;2. Q-Learning3. SARSA算法4. SARSA&#xff08;λ&#xff09; Reinforcement-Learning 1. RL方法分类汇总&#xff1a; &#xff08;1&#xff09;不理解环境&#xff08;Model-Free RL&#xff09;&#xff…

无涯教程-jQuery - outerWidth( margin])方法函数

outerWidth([margin])方法获取第一个匹配元素的外部宽度(默认情况下包括边框和填充)。 此方法适用于可见和隐藏元素。由于父项被隐藏的元素不支持此功能。 outerWidth( [margin] ) - 语法 selector.outerWidth( [margin] ) 这是此方法使用的所有参数的描述- margin - 此…

OpenLayers实战进阶专栏目录,OpenLayers实战案例,OpenLayers6实战教程

前言 本篇作为OpenLayers实战进阶教程的目录&#xff0c;用于整理汇总专栏所有文章&#xff0c;方便查找。 OpenLayers是前端最流行的JS二维地图引擎之一。 反馈建议 OpenLayers系列-交流专区&#xff0c;建议和问题反馈 Openlayers实战进阶 Openlayers实战&#xff0c;O…

SQL-每日一题【1148. 文章浏览 I】

题目 Views 表&#xff1a; 请查询出所有浏览过自己文章的作者 结果按照 id 升序排列。 查询结果的格式如下所示&#xff1a; 示例 1&#xff1a; 解题思路 1.题目要求我们查询出所有浏览过自己文章的作者&#xff0c;结果按照 id 升序排列。 2.我们只需要筛选出 author_id …

消防应急照明设置要求在炼钢车间电气室的应用

摘 要:文章以GB51309—2018《消防应急照明和疏散指示系统技术标准》为设计依据&#xff0c;结合某炼钢车间转炉项目的设计过程&#xff0c;在炼钢车间电气室的疏散照明和备用照明的设计思路、原则和方法等方面进行阐述。通过选择合理的消防应急疏散照明控制系统及灯具供配电方案…

java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

&#xfeff; 电子招标采购软件 解决方案 招标面向的对象为供应商库中所有符合招标要求的供应商&#xff0c;当库中的供应商有一定积累的时候&#xff0c;会节省大量引入新供应商的时间。系统自动从供应商库中筛选符合招标要求的供应商&#xff0c;改变以往邀标的业务模式。招…

独立站有流量没订单是什么原因呢?怎么解决?

和自带流量的电商平台比起来&#xff0c;外贸独立站自身是没有流量的。独立站卖家要订单&#xff0c;就必须主动去引流。 如果你是1个独立站新手卖家&#xff0c;你很可能遇到过这种问题&#xff1a;跑了一段时间广告&#xff0c;广告费花了几百上千美金&#xff0c;流量来了不…

集合简述

集合ListArrayListLinkedList SetHashSetTreeSet MapHashMapTreeMap 集合与数组的区别 集合 集合是java中的一个容器&#xff0c;可以在里面存放数据&#xff0c;容量可以发生改变 从集合框架结构可以分析得知&#xff1a; 1、集合主要分为Collection和Map两个接口 2、Collecti…