【笔记】位运算

news2024/9/27 7:25:26

文章目录

    • 位运算简介
      • 与运算&
      • 或运算|
      • 异或运算^
        • 证明
      • 取反~
      • 左移<<
      • 右移>>
    • 位运算技巧
      • 判断奇偶性
      • 求出x二进制的第i位
      • 将二进制的第i位设置成1
      • 将二进制的第i位设置成0
      • 判断是否为2的若干次方
      • 获取x的最低位的1
        • 用lowbit运算统计1的个数
        • 例题

位运算简介

位运算:面向二进制的计算,二进制的位数是从0开始(右到左)

  • 与运算:有0得0(有一个是假的,结果就是假的)
  • 或运算:有1得1(有一个是真的,结果就是真的)
  • 异或运算:相同为0,不同为1(相同结果为假,不同结果为真)
  • 取反
  • 左移、右移

与运算&

xyx&y
000
010
100
111

6&11=0110&1011=0010=2
在这里插入图片描述

或运算|

xyx/y
000
011
101
111

6|11=0110|1011=1111=15
在这里插入图片描述

异或运算^

000
000
101
011
110
  • 交换律:x^y=y^x
  • 结合律:x^(y^z)=(x^y)^z
  • 自反性:x^x=0
  • 零元素:x^0=x
  • 逆运算:x^y=z-->z^y=x
证明

对于交换律,很显然,异或是比较xy是否有不同,跟位置没关系。

对于结合律,异或是比较xyz……是否有不同,跟位置没关系。
比如(1^1)^0=0^0=0 1^(1^0)=1^1=0 (1^1)^1=0^1=1 1^(1^1)=1^0=1
只要有一个不同,就变成1,如果又遇到相同的,就变成0,直到变完为止……
这种相同以及不同的关系跟位置没啥关系。

对于零元素,当x=1,1^0=1,当x=0,0^0=0

对于自反性,根据异或运算定义,x=x,所以x^x=0

对于逆运算,x^y=z-->x^y^y=z^y-->x^0=x=z^y

取反~

把二进制的0变成1,1变成0
~6= ~0110=1001=9
~1=0001=1110=
在这里插入图片描述

左移<<

二进制向左移动指定位数
每次左移一位,相当于乘上2

5=0000 0101
5<<3=0010 1000=40
在这里插入图片描述

右移>>

每次右移一位,相当于除以2

13=1101
13>>2=0011=3
在这里插入图片描述

位运算技巧

判断奇偶性

  • 对2求余数:x%2
    • 直接判断二进制的第0位是1或者0
    • 相当于直接判断x&1

13&1=1101&0001=0001 所以13%2=1
12%1=1100&0001=0000 所以12%2=0

求出x二进制的第i位

  • 已知获取第0位:直接&1
  • 那先把第i位转成第0位(右移i位),再求第0位就可以得到原来的第i位

(x>>i)&1

假如需要求19的第三位是多少。
(19>>3)&1=(0001 0011>>3)&0000 0001=0000 0010&0000 0001=0000 0000=0

将二进制的第i位设置成1

x|(1<<i)

原理:把1左移到第i位和x的第i位对应,此时已经有一方是1,或运算后值的第i位一定是1,其他位和0进行或运算得到原来的值。

比如把19的第三位设置成1
19|(1<<3)=0001 0011|(0000 0001<<3)=0001 0011|00001000=0001 1011=27

将二进制的第i位设置成0

x&~(1<<i)

原理:把1左移到第i位和x的第i位对应,取反后除了第i位是0,其他都是1,再和x进行与运算,只要x是1的最后还是1,x是0的最后还是0,x的第i位一定是0.

比如把19的第四位设置成0
19&~(1<<4)=0001 0011& ~(0001 0000)=0001 0011&1110 1111=0000 0011=3

判断是否为2的若干次方

  • 判断x&(x-1)是否为0
  • 原理:2的若干次方进制表示只存在一个1。

如果x&(x-1)=0说明二进制中只有1个1.

获取x的最低位的1

Lowbit(x)=x&(-x)这个函数的值是x的二进制表达式中最低位的1所对应的值。

这里涉及二进制的负数。

二进制的负数用补码表示,补码就是取其绝对值的二进制表示(即正数的二进制表示),然后取反(0变1,1变0),最后加1得到。

如果求-8的二进制写法:

  • 先求出+8的二进制:0000 0100
  • 取反:1111 1011
  • 加1:1111 1100

以二进制表示+12是0000 1100;
以二进制表示-8是1111 1000;
12-8=0000 0100=4
进位会传递到最左边的所有1上,把他们同时设置为0

回到Lowbit(x)=x&(-x),可以发现变为反码后 x 与反码数字位每一位都不同, 所以当反码加1后神奇的事情发生了,反码会逢1一直进位直到遇到0,且这个0变成了1,所以这个数最后面构造了一个 100… 串。 由于是反码,进位之后由于1的作用使进位的部分全部取反及与原码相同,所以可以发现 lowbit 以前的部分 x 与其补码即 -x 相反, lowbit x 与 -x 都是1,lowbit 以后 x 与 -x 都是0 所以 x&-x 后除了 lowbit 位是1,其余位都是0。符合条件。

用lowbit运算统计1的个数
ans=0
while x:
	x-=x&(-x)
	ans+=1
例题

lanqiao1331 二进制中 1 的个数

lanqiao3691 区间或

lanqiao3440 异或森林

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

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

相关文章

【吊打面试官系列-Redis面试题】使用过 Redis 分布式锁么,它是什么回事?

大家好&#xff0c;我是锋哥。今天分享关于【使用过 Redis 分布式锁么&#xff0c;它是什么回事&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 使用过 Redis 分布式锁么&#xff0c;它是什么回事&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资…

对目录的操作、获取文件信息

目录 一、目录操作 二、获取文件的相关信息 1、演示获取文件的相关信息 2、注意事项和细节 一、目录操作 需求&#xff1a; 1&#xff09;创建一级目录 d://aaa 2&#xff09;创建多级目录 d://bbb//ccc 3&#xff09;删除目录 d://aaa和d://bbb//ccc import os# 1&am…

自定义AI模型的调优、部署与评测

为了让大语言模型的AI能力更贴近业务需求&#xff0c;本文详细介绍了在阿里云百炼创建自定义模型的最佳实践。即便不清楚大模型的技术细节&#xff0c;您也能按照本篇的操作指引创建一个有效的自定义模型&#xff0c;从而轻松地为业务场景添加大模型服务能力。 自定义模型概述…

深度学习数据集交通类常见图像分类、目标检测、分割图像数据集(深度学习数据集 - 交通类解决方案)

深度学习数据集 - 交通类解决方案 引言&#xff1a; 随着自动驾驶技术的发展以及智能交通系统的普及&#xff0c;对于高质量、多样化的交通数据集的需求日益增长。我们提供一系列精心准备的数据集&#xff0c;旨在帮助研究人员和工程师解决实际问题&#xff0c;推动技术创新。…

arcgisPro修改要素XY容差

1、在arcgisPro中XY容差的默认值为1个毫米&#xff0c;及0.001米。为了更精细的数据&#xff0c;需要提高这个精度&#xff0c;如何提高呢&#xff1f; 2、如果直接在数据库下新建要素类&#xff0c;容差只能调至0.0002米。所以&#xff0c;需要在数据库下新建要素数据集。 3…

机房运维工作的核心:确保系统稳定与高效

在当今的信息化时代&#xff0c;运维工作成为了确保企业信息系统稳定运行的关键环节。运维团队肩负着监控系统性能、处理故障、优化系统配置等多重任务&#xff0c;以确保平台的持续、高效运行。本文将围绕运维工作的几个核心方面展开讨论&#xff0c;并以监控易一体化运维软件…

【Linux下的cpp】编译调试(gcc、g++、gdb)

【Linux下的cpp】编译调试&#xff08;gcc、g、gdb&#xff09; 文章目录 【Linux下的cpp】编译调试&#xff08;gcc、g、gdb&#xff09;简述gcc、g、gdb编译过程g 编译参数命令行编译演练1、直接编译2、生成库文件并编译链接静态库并生成可执行文件链接动态库生成可执行文件 …

vue vueUse利用useInfiniteScroll API 实现虚拟滚动

前言 中文网地址:开始使用 | VueUse 中文网 官网地址:VueUse 元素的无限滚动。 useInfiniteScroll 详细解析地址 效果 组件封装

7-14 电话聊天狂人(map)

输入样例: 4 13005711862 13588625832 13505711862 13088625832 13588625832 18087925832 15005713862 13588625832输出样例: 13588625832 3 代码&#xff1a; #include<iostream> #include<map> using namespace std; map<string,int>mp; string ansstr;…

华为OD机试 - 推荐多样性(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

nginx负载均衡(轮询与权重)

文章目录 1. nginx的介绍2. nginx使用场景3. nginx在windows的下载与安装4. nginx的简单使用5. nginx进行轮询测试6. nginx进行权重测试7. 总结 1. nginx的介绍 Nginx&#xff08;engine x&#xff09;是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也是一个开源的、…

PASCAL VOC数据集语义分割:解决标签值错误与数据增强不同步问题的优化方案

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 错误原因分析&#xff1a; Assertion错误&#xff1a; 错误信息显示 Assertion t > 0 && t < n_classes failed.&#xff0c;这意味着在计算损失时&#xff0c;标签t的值不…

第四天旅游线路预览——从换乘中心到喀纳斯湖

第四天&#xff1a;从贾登峪到喀纳斯风景区入口&#xff0c;晚上住宿贾登峪&#xff1b; 换乘中心有4 路车&#xff0c;喀纳斯①号车&#xff0c;去喀纳斯湖&#xff0c;路程时长约5分钟&#xff1b; 将上面的的行程安排进行动态展示&#xff0c;具体步骤见”Google earth stu…

【devops】devops-git之github使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

继承和多态(详解)

&#x1f423;继承和多态 &#x1f31e; 继承&#x1f33b;1.引入&#x1f33b;2.访问父类成员&#x1f335;2.1 子类访问父类中的成员变量&#x1f335;2.2 子类访问父类中的成员方法 &#x1f33b;3.super关键字&#x1f33b;4.子类构造方法&#x1f33b;5.super和this&#…

java spring validation 自动、手动校验

目录 一、自动校验 第一步&#xff0c;导入依赖 第二步&#xff0c;统一异常处理 第三步&#xff0c;定义接口接收实体DTO 第四步&#xff0c;在Contoller接口中增加参数注解Validated 第五步&#xff0c;测试结果 二、手动校验 第一步&#xff0c;校验工具类 第二步&…

Protubuf入门

⼀、初识 ProtoBuf 1. 序列化概念 序列化和反序列化 序列化&#xff1a;把对象转换为字节序列的过程 称为对象的序列化。 反序列化&#xff1a;把字节序列恢复为对象的过程 称为对象的反序列化。 什么情况下需要序列化 存储数据&#xff1a;当你想把的内存中的对象状态…

Spring Boot环境下的读书笔记交流网络

第2章 技术介绍 2.1B/S架构 当向其他用户发送请求的功能时应用B/S模式具有独一无二的优点&#xff1a;用户请求通过网络向其他Web服务器发送时只需要通过浏览器就可以实现该功能。该功能的好处之一就是有效简化了客户端&#xff0c;大部分开发的软件只需要用浏览器即可&#xf…

QT Mode/View之View

目录 概念 使用已存在的视图 使用模型 使用模型的多个视图 处理元素的选择 视图间共享选择 概念 在模型/视图架构中&#xff0c;视图从模型中获取数据项并将它们呈现给用户。数据的表示方式不必与模型提供的数据表示形式相似&#xff0c;而且可能与用于存储数据项的底层数…

【重学 MySQL】二十四、笛卡尔积的错误和正确的多表查询

【重学 MySQL】二十四、笛卡尔积的错误和正确的多表查询 笛卡尔积的理解和错误笛卡尔积的理解定义例子在数据库中的应用总结 笛卡尔积的错误 正确的多表查询使用 INNER JOIN使用 WHERE 子句&#xff08;隐式内连接&#xff09; 总结 在数据库查询中&#xff0c;特别是涉及到多表…