异或神操作_二进制底层

news2024/11/24 6:20:37

二进制的基础

java里位运算符是对补码处理的, java里取反符号~会导致符号位改变

  1. 计算机里采用补码存储数值
    对于正数,其补码、原码和反码都是相同的。即,正数的补码就是其本身。
    对于负数,补码的计算过程相对复杂一些,但遵循固定的步骤:

求原码:负数的原码是其绝对值的二进制表示,但最高位(符号位)为1。
求反码:将原码的符号位保持不变,其余各位取反(即0变为1,1变为0)。
求补码:在反码的基础上加1,即可得到负数的补码。

所以求源码,需要减1再取反(符号位不变)
仔细想想,取反加1获得的补码,其源码为原来的相反数
获取最低位1的状态只需&1即可

java里逻辑移位(>>>)以及算数位移(>>)

逻辑位移会默认将缺的位补0,那么一个数逻辑右移后最高位默认是0
算数位移则是最高位保持原来状态,原来最高位是几,移位后还是几

异或
本质为不进位相加 1^1=0 0^0=0 0^1=1 可以看出一个数异或任意另外一个数 偶数次,该数保持不变,如a^b^b=a

那么就有以下操作

	public static void swap(int a,int b) {        //交换两个数
		a^=b;   //a^b
		b^=a;   //b^a^b
		a^=b;   //a^b ^b^a^b
		System.out.println(a);         //打印b的值
	}

题目:找到缺失的数

给一个数组,里面包含0~9这10个数,但是缺失了一个数,使得数组长度为9,在不用哈希情况下找到这个数.

public static void main(String[] args){
		int[] arr=new int[] {1,2,3,4,6,7,8,9,0}; //对于这个测试用例来说其缺失了5
		int cur=0;
		for(int i:arr) {
			cur^=i;
		}
		for(int i=0;i<=9;i++) {
			cur^=i;
		}
		System.out.println(cur);
	}

实现->不用判断和max函数求两个int类型的最大一个

	public static int getMax(int a,int b) {
		int c=a-b;        //通过判断c是正数还是负数判断a是否大于b
		c>>>=31;          //保留最高位即可,最高位为1的话为负数,则a<b
		return c*b+((c^1)*a);
	}

但是此方法有个缺陷,那便是溢出问题,当然我们可以使用long类型解决,但是如何更优雅的使用只用int解决呢

什么时候相减的时候会发生溢出现象呢,当然是数值比较大,且号位相反,例如负数减正数,正数减负数,这样都会使得绝对值加大,导致溢出现象,但是翻过来思考,当号位相反,我们直接返回正数那个就行了,不需要相减判断,只需要判断谁是正数即可。

	public static int getMax2(int a,int b) {
		int bigger_zero=(a>>>31)^1;   //判断a是否大于0
		
		int notSame=(a>>>31)^(b>>>31),isSame=1^notSame;//判断a和b是否符号位相同
		
		int smaller=((a-b)>>>31),bigger=smaller^1; //判断a-b结果是大于0还是小于0 
		
		int choosea=(isSame&bigger)|(notSame&bigger_zero);//只需要判断是否选择a即可,因为这是非a即b的选择
		return choosea*a+(choosea^1)*b;  //最后只会加一个值,非a即b
	}

Brian Kernighan算法 求最右状态的1

给一个数例如二进制表示的为:01101000 应该返回的值是00001000

  1. 先取反得到10010111
  2. 加1得到10011000
  3. 再与原来的数进行与运行01101000&10011000=00001000
    由于取反加1得到是相反数于是可以直接n&(-n)获取n的最右侧1
public static int getRight(int n){
		return n&(-n);
	}

找到唯二出现的数

题目:
给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。

  1. 通过异或所有元素获得a^b的结果,cur=cur2=a ^ b
  2. 获取a异或b中的存在1的位置curr
  3. 再遍历一遍数组,与curr不为0的异或cur,否则异或cur2,相信学了上面的知识,你已经知道为什么这样做了
class Solution {
    static public int cur=0;
    public int[] singleNumber(int[] nums) {
        cur=0;
        for(int i:nums){
            cur^=i;
        }
        int curr=cur&(-cur);
        int cur2=cur;
        for(int i:nums){
            if((i&curr)==0)cur^=i;
            else cur2^=i;
        }
        return new int[]{cur,cur2};

    }
}

判断一个数是否为2的某次方

public boolean int isPow(int n){
		return n==(n&-n);
	}

int 类型判断一个数是否为3的某次方

public boolean int isPow(int n){
		return n>0&&Math.pow(3,19)%n==0;        //3的19次方为int类型最大3的次方
	}

求大于一个数的最小2的某次幂

public int getmin(int n){
		if(n<=0)return 1;
		for(int i=1;i<=8;i*=2){
			n|=(n>>>i);
			}
		return n+1;
	}

快速求与&区间[left,right]的所有值

public int getres(int left,int right){
		while(right>left){
				right-=right&-right;
			}
		return right;
	}

归并思想倒置二进制 10001100 -> 00110001

public static int reverseBit(int n){
		n=((n&0xaaaaaaaa)>>>1) | ((n&55555555)<<1);
		n=((n&0xcccccccc)>>>2) | ((n&0x33333333)<<2);
		n=((n&0xf0f0f0f0)>>>4) | ((n&0x0f0f0f0f)<<4);
		n=((n&0xff00ff00)>>>8) | ((n&0x00ff00ff)<<8);
		n=(n>>>16)|(n<<16);
		return n;
	}
	

快速获取二进制数里有几个1

public static int getone(int n){
		n=(n&0x55555555)+((n>>>1)&0x55555555);
		n=(n&0x33333333)+((n>>>2)&0x33333333);
		n=(n&0x0f0f0f0f)+((n>>>4)&0x0f0f0f0f);
		n=(n&0x00ff00ff)+((n>>>8)&0x00ff00ff);
		n=(n&0000ffff)+((n>>>16)&0xffff0000);
		return n;
	}

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

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

相关文章

Sickos1.1 详细靶机思路 实操笔记

Sickos1.1 详细靶机思路 实操笔记 免责声明 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担…

【大数据学习 | Spark-Core】Spark提交及运行流程

spark的集群运行结构 我们要选择第一种使用方式 命令组成结构 spark-submit [选项] jar包 参数 standalone集群能够使用的选项。 --master MASTER_URL #集群地址 --class class_name #jar包中的类 --executor-memory MEM #executor的内存 --executor-cores NUM # executor的…

【CSP CCF记录】201903-2第16次认证 二十四点

题目 样例1输入 10 934x3 54x5x5 7-9-98 5x6/5x4 3579 1x19-9 1x9-5/9 8/56x9 6x7-3x6 6x44/5 样例1输出 Yes No No Yes Yes No No No Yes Yes 样例1解释 思路 参考&#xff1a;CCF小白刷题之路---201903-2 二十四点&#xff08;C/C 100分&#xff09;_ccf认证小白-CSDN博客 …

多目标粒子群优化(Multi-Objective Particle Swarm Optimization, MOPSO)算法

概述 多目标粒子群优化&#xff08;MOPSO&#xff09; 是粒子群优化&#xff08;PSO&#xff09;的一种扩展&#xff0c;用于解决具有多个目标函数的优化问题。MOPSO的目标是找到一组非支配解&#xff08;Pareto最优解&#xff09;&#xff0c;这些解在不同目标之间达到平衡。…

tomcat 后台部署 war 包 getshell

1. tomcat 后台部署 war 包 getshell 首先进入该漏洞的文件目录 使用docker启动靶场环境 查看端口的开放情况 访问靶场&#xff1a;192.168.187.135:8080 访问靶机地址 http://192.168.187.135:8080/manager/html Tomcat 默认页面登录管理就在 manager/html 下&#xff0c…

4.6 JMeter HTTP信息头管理器

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 HTTP信息头管理器的位置2 常见的HTTP请求头3 添加 HTTP 信息头管理器4 应用场景 前言 在 JMeter 中&#xff0c;HTTP信息头管理器&#xff08;HTTP Header Manager&#xff09…

NVR管理平台EasyNVR多品牌NVR管理工具的流媒体视频融合与汇聚管理方案

随着信息技术的飞速发展&#xff0c;视频监控已经成为现代社会安全管理和业务运营不可或缺的一部分。无论是智慧城市、智能交通、还是大型企业、校园安防&#xff0c;视频监控系统的应用都日益广泛。NVR管理平台EasyNVR&#xff0c;作为功能强大的流媒体服务器软件&#xff0c;…

【大数据学习 | Spark-Core】Spark的改变分区的算子

当分区由多变少时&#xff0c;不需要shuffle&#xff0c;也就是父RDD与子RDD之间是窄依赖。 当分区由少变多时&#xff0c;是需要shuffle的。 但极端情况下&#xff08;1000个分区变成1个分区)&#xff0c;这时如果将shuffle设置为false&#xff0c;父子RDD是窄依赖关系&…

微代码-C语言如何分配内存并自动清零?(calloc)

背景 在C语言中&#xff0c;calloc 函数用于分配内存&#xff0c;并且会自动将所有位初始化为零。calloc 的原型定义在 stdlib.h 头文件中&#xff0c;其函数原型如下&#xff1a; void *calloc(size_t num, size_t size);使用例子&#xff1a; #include <stdio.h> #i…

自动语音识别(ASR)与文本转语音(TTS)技术的应用与发展

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)

文章目录 1、ARM 架构ARM 架构的特点ARM 架构的应用ARM 架构的未来发展 2、RISCRISC 的基本概念RISC 的优势RISC 的应用RISC 与 CISC 的对比总结 1、ARM 架构 ARM 架构是一种低功耗、高性能的处理器架构&#xff0c;广泛应用于移动设备、嵌入式系统以及越来越多的服务器和桌面…

戴尔 AI Factory 上的 Agentic RAG 搭载 NVIDIA 和 Elasticsearch 向量数据库

作者&#xff1a;来自 Elastic Hemant Malik, Dell Team 我们很高兴与戴尔合作撰写白皮书《戴尔 AI Factory with NVIDIA 上的 Agentic RAG》。白皮书是一份供开发人员参考的设计文档&#xff0c;概述了实施 Agentic 检索增强生成 (retrieval augmented generation - RAG) 应用…

Vue实训---0-完成Vue开发环境的搭建

1.在官网下载和安装VS Code编辑器 完成中文语言扩展&#xff08;chinese&#xff09;&#xff0c;安装成功后&#xff0c;需要重新启动VS Code编辑器&#xff0c;中文语言扩展才可以生效。 安装Vue-Official扩展&#xff0c;步骤与安装中文语言扩展相同&#xff08;专门用于为“…

POA-CNN-SVM鹈鹕算法优化卷积神经网络结合支持向量机多特征分类预测

分类预测 | Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络结合支持向量机多特征分类预测 目录 分类预测 | Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现POA-CNN-SVM鹈鹕算法…

(STM32)ADC驱动配置

1.ADC驱动&#xff08;STM32&#xff09; ADC模块中&#xff0c;**常规模式&#xff08;Regular Mode&#xff09;和注入模式&#xff08;Injected Mode&#xff09;**是两种不同的ADC工作模式 常规模式&#xff1a;用于普通的ADC转换&#xff0c;是默认的ADC工作模式。 注入…

flume-将日志采集到hdfs

看到hdfs大家应该做什么&#xff1f; 是的你应该去把集群打开&#xff0c; cd /export/servers/hadoop/sbin 启动集群 ./start-all.sh 在虚拟机hadoop02和hadoop03上的conf目录下配置相同的日志采集方案&#xff0c;‘ cd /export/servers/flume/conf 切换完成之后&#…

机器人SLAM建图与自主导航:从基础到实践

前言 这篇文章我开始和大家一起探讨机器人SLAM建图与自主导航 &#xff0c;在前面的内容中&#xff0c;我们介绍了差速轮式机器人的概念及应用&#xff0c;谈到了使用Gazebo平台搭建仿真环境的教程&#xff0c;主要是利用gmapping slam算法&#xff0c;生成一张二维的仿真环境…

在线解析工具链接

在线字数统计工具-统计字符字节汉字数字标点符号-计算word文章字数字数统计,字符统计,字节统计,字数计算,统计字数,统计字节数,统计字符数,统计word字数,在线字数统计,在线查字数,计算字数,字数统计工具,支持手机移动端查询多少字数,英文:Calculate the number of words,Count …

学习Servlet(含义,作用)

目录 前言 Servlet 的含义 Servlet 的作用 前言 一个完整的前后端项目&#xff0c;是需要前端和后端&#xff08;Java实现&#xff09;共同完成的。那应该如何实现前后端进行交互呢&#xff1f;答案&#xff1a;使用Servlet实现前后端交互 我会从了解Servlet的含义&…

从源码到应用:在线教育系统与教培网校APP开发实战指南

时下&#xff0c;各类教培网校APP逐渐成为教育机构的核心工具。那么&#xff0c;如何从源码出发&#xff0c;开发一套符合需求的在线教育系统与教培网校APP&#xff1f;本文将从架构设计、功能实现到部署上线&#xff0c;提供一份全面的开发实战指南。 一、在线教育系统的核心架…