大一计算机的自学总结:异或运算
前言
异或运算这个操作看上去很匪夷所思,实际上作用非常大。
一、异或运算的性质
1.异或运算就是无进位相加。
2.满足交换律、结合律。
3.0^n=n,n^n=0。
4.若集合B为集合A子集,集合A异或和为x,集合B异或和为y,则集合A-B异或和为x^y。
#include<bits/stdc++.h>
using namespace std;//打印二进制
void printBinary(int n)
{for(int i=15;i>=0;i--){cout<<((n&(1<<i))==0?"0":"1");}cout<<endl;
}int sumOfEor(vector<int>arr,int l,int r)
{int sum=arr[l];for(int i=l+1;i<=r;i++){sum^=arr[i];}return sum;
}int main()
{int n=78;cout<<"n in binary:";printBinary(n);//性质cout<<"0^n:";printBinary(0^n);cout<<"n^n:";printBinary(n^n);vector<int>arr(10);for(int i=0;i<10;i++){cin>>arr[i];}//性质4cout<<"sum of eor in 0~7:";cout<<sumOfEor(arr,0,7)<<endl;cout<<"sum of eor in 8~9:";cout<<sumOfEor(arr,8,9)<<endl;cout<<"sum of eor in 0~9:";cout<<sumOfEor(arr,0,9)<<endl;int result=sumOfEor(arr,0,7)^sumOfEor(arr,8,9);cout<<result<<endl;//交换两数int a,b;cout<<"a,b:"<<endl;cin>>a>>b; a=a^b;b=a^b;a=a^b;cout<<"a,b:"<<endl;cout<<a<<" "<<b;return 0;
}
二、相关题目
1.获取最大值
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 获取最大值* @param a int整型 * @param b int整型 * @return int整型*/int sign(int n){return (n>>31)&1^1;}int getMax(int a, int b) {// write code hereint c=a-b;int signA=sign(a);int signB=sign(b);int signC=sign(c);int diffAB=signA^signB;//判断符号是否一样int sameAB=diffAB^1;int returnA=diffAB*signA+sameAB*signC;int returnB=returnA^1;return a*returnA+b*returnB;}
};
为了防止a-b这一步发生数据溢出,可以做以下操作:
首先不管三七二十一先算出a-b,然后分别取a,b,c的符号。这里取符号函数是让该数右移31位后,&1取此时最后一位,即第31位符号位的数,然后^1,若负数返回0,正数返回0。
之后判断a,b符号是否不相同并用变量记住信息,若不同则为1,然后^1就是符号是否相同。
然后,进行分类讨论。若a,b符号不同且a为负数,则b为正数,是最大值,returnA为0;或者若a,b符号相同且c为负数,则此时b也为最大值,否则a为最大值。
最后,按照returnA和returnB的信息来确定返回值。
这里的重点是用变量存储信息的思路!!!
2.丢失的数字
class Solution {
public:int missingNumber(vector<int>& nums) {int sum=0;for(int i=1;i<=nums.size();i++){sum^=i;}int sumNums=0;for(int i=0;i<nums.size();i++){sumNums^=nums[i];}return sum^sumNums;}
};
根据上述性质4,若已知整体0~n的异或和和数组异或和,只要将两者异或和求异或即为缺失数。
3.只出现一次的数字
class Solution {
public:int singleNumber(vector<int>& nums) {int num=0;for(int i=0;i<nums.size();i++){num^=nums[i];}return num;}
};
如果只有一个数字出现一次,其他数字出现两次,根据上述性质3,两相同数的异或结果为0,所以只需要求数组异或和即为只出现一次的数。
4.只出现一次的数字 III
class Solution {
public:vector<int> singleNumber(vector<int>& nums) {vector<int>arr(2);long eor1=0;for(int i=0;i<nums.size();i++){eor1^=nums[i];}int rightOne=eor1&(-eor1);int eor2=0;for(int i=0;i<nums.size();i++){if((nums[i]&rightOne)==0){eor2^=nums[i];}}arr={(int)eor2,(int)eor1^eor2};return arr;}
};
若有两种数出现一次,思考此时两数的二进制以及数组异或和的二进制特征,可以发现(雾),因为两数不同,所以两数至少有一位的二进制状态不同,则数组异或和的二进制必存在一个1。
Brian-Kernighan算法:取一个数二进制最右侧1的状态——n&(-n)
根据这一位是否是1,可以将数组划分成两部分,所以只出现一次的这两种数必分别位于这两部分,又因为其他数都出现两次,所以将这一位为0的数求异或和即为两数中其中一位,根据性质3,eor1^eor2即为另一个数。
这个题已经有点考验思路了,思考的部分比较难想了。
5.只出现一次的数字 II
推广:数组中只有一个数出现少于m次,其他m次,返回这个数。
class Solution {
public:int singleNumber(vector<int>& nums) {vector<int>cnts(32,0);for(int i=0;i<nums.size();i++){for(int j=0;j<32;j++){cnts[j]+=(nums[i]>>j)&1;}}int ans=0;for(int i=0;i<32;i++){if(cnts[i]%3!=0){ans|=1<<i;}}return ans;}
};
这个题就更考验思维了,从二进制每个数位来考虑,统计每个数位上1出现的次数之和,若为m的倍数,则说明这个数在这位上为0;若%m!=0,则说明这个数在这位上为1。
之后开个32大小的数组存次数,最后根据次数是否为m的倍数往ans里填1即可。
总结
异或运算在解决某些问题时会有奇效,运用得当的话会非常厉害,只要能想出思路(汗)。
END
相关文章:
大一计算机的自学总结:异或运算
前言 异或运算这个操作看上去很匪夷所思,实际上作用非常大。 一、异或运算的性质 1.异或运算就是无进位相加。 2.满足交换律、结合律。 3.0^nn,n^n0。 4.若集合B为集合A子集,集合A异或和为x,集合B异或和为y,则集…...
通过protoc工具生成proto的pb.go文件以及使用protoc-go-inject-tag工具注入自定义标签
1.ProtoBuf认识,安装以及用法 参考:[golang 微服务] 3. ProtoBuf认识,安装以及golang 中ProtoBuf使用 2. 使用protoc-go-inject-tag工具注入自定义标签 这里有一个案例: syntaxproto3; package test;option go_package ".;test";message MyMessage {int6…...
C语言练习(29)
13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子,找出最后留在圈子中的人原来的序号。本题要求用链表实现。 #include <stdio.h> #include <stdlib.h>// 定义链表节点结构体 typedef struct Node {int num;struct Nod…...
Android实训九 数据存储和访问
实训9 数据存储和访问 一、【实训目的】 1、 SharedPreferences存储数据; 2、 借助Java的I/O体系实现文件的存储, 3、使用Android内置的轻量级数据库SQLite存储数据; 二、【实训内容】 1、实现下图所示的界面,实现以下功能: 1ÿ…...
实验一---典型环节及其阶跃响应---自动控制原理实验课
一 实验目的 1.掌握典型环节阶跃响应分析的基本原理和一般方法。 2. 掌握MATLAB编程分析阶跃响应方法。 二 实验仪器 1. 计算机 2. MATLAB软件 三 实验内容及步骤 利用MATLAB中Simulink模块构建下述典型一阶系统的模拟电路并测量其在阶跃响应。 1.比例环节的模拟电路 提…...
SOME/IP--协议英文原文讲解2
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.1 Speci…...
matlab中,fill命令用法
在 MATLAB 中,fill 命令用于创建填充多边形的图形对象。使用 fill 可以在二维坐标系中绘制填充的区域,通常用于绘制图形的背景或显示数据分布。 基本语法 fill(X, Y, C)X 和 Y 是同样长度的向量,定义了多边形的顶点坐标。C 是颜色࿰…...
【Linux】Linux C判断两个IPv6地址是否有包含关系
功能说明 要判断两个 IPv6 地址是否具有包含关系,包括前缀的比较,可以通过以下步骤实现: 解析 IPv6 地址和前缀:将两个 IPv6 地址和它们的前缀长度解析为二进制形式。生成掩码:根据前缀长度生成掩码。按位比较&#…...
【玩转全栈】----Django基本配置和介绍
目录 Django基本介绍: Django基本配置: 安装Django 创建项目 创建app 注册app Django配置路由URL Django创建视图 启动项目 Django基本介绍: Django是一个开源的、基于Python的高级Web框架,旨在以快速、简洁的方式构建高质量的Web…...
mysql 学习6 DML语句,对数据库中的表进行 增 删 改 操作
添加数据 我们对 testdatabase 数据中 的 qqemp 这张表进行 增加数据,在这张表 下 打开 命令行 query console 在 软件中就是打开命令行的意思 可以先执行 desc qqemp; 查看一下当前表的结构。 插入一条数据 到qqemp 表,插入时要每个字段都有值 insert…...
自动化运维在云环境中的完整实践指南
随着云计算的普及,越来越多的企业将业务迁移到云上。云环境的高动态性和复杂性使得传统的手动运维方式难以应对,自动化运维成为提升效率、降低成本、保障系统稳定性的关键。本文将详细介绍如何在云环境中实施自动化运维,涵盖工具选择、实施步骤和最佳实践。 © ivwdcwso…...
一分钟搭建promehteus+grafana+alertmanager监控平台
为什么要自己搭建一个监控平台 平时进行后端开发,特别是微服务的后端可开发,一定少不了对接监控平台,但是平时进行一些小功能的测试又没有必要每次都手动安装那么多软件进行一个小功能的测试,这里我使用docker-compose搭建了一个…...
【10.2】队列-设计循环队列
一、题目 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普…...
设置jmeter界面图标字体大小
设置jmeter界面图标字体大小 方法:点击“选项” -> 点击放大、缩小。(可进行全局的菜单、左侧目录结构树、元件界面显示等字体图标的放大、缩小。)...
Xposed-Hook
配置 Xposed 模块的 AndroidManifest.xml: <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"your.package.name"><applicationandr…...
设计模式Python版 原型模式
文章目录 前言一、原型模式二、原型模式示例三、原型管理器 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对…...
QT:图像上绘制图形
需求描述 1、展示一张图像 2、在图像上可以使用数据绘制图像:矩形、不规则图形、线条 3、有按键可以选择 概要设计 规划布局如下 1、左边是Qlabel 用于展示图片 2、右边是三个按钮 具体实现 1、 首先设计 UI 界面,对控件进行布局 在 mainwindow.u…...
GPU上没程序在跑但是显存被占用
原因:存在僵尸线程,运行完但是没有释放内存 查看僵尸线程 fuser -v /dev/nvidia*关闭僵尸线程 pkill -9 -u 用户名 程序名 举例:pkill -9 -u grs python参考:https://blog.csdn.net/qq_40206371/article/details/143798866...
wordpress代码结构解析
WordPress 是一个基于 PHP 和 MySQL 的开源内容管理系统(CMS),广泛用于构建网站和博客。要解析 WordPress 代码,首先需要了解其核心结构、主要文件和常用的函数。以下是 WordPress 代码解析的基本指南: --- ### 1. *…...
【Unity3D】实现2D小地图效果
目录 一、玩家脚本Player 二、Canvas组件设置 三、小地图相关 四、GameLogicMap脚本修改 基于:【Unity3D】Tilemap俯视角像素游戏案例-CSDN博客 2D玩家添加Dotween移动DOPath效果,移动完成后进行刷新小地图(小地图会顺便刷新大地图&…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
