返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java-异或运算详解
  • 706
分享到

Java-异或运算详解

数据结构javaPoweredby金山文档 2023-10-08 06:10:25 706人浏览 安东尼
摘要

基本概念 异或运算,符号为XOR或者^,是二进制的运算,运算法则为相同为0,不同为1,我记得时候反正总会忘(和同或记反),所以这里直接把异或理解为"不进位的二进制相加".举个栗子: 1000111 和 1110001 异或 按照不进位

基本概念

异或运算,符号为XOR或者^,是二进制的运算,运算法则为相同为0,不同为1,我记得时候反正总会忘(和同或记反),所以这里直接把异或理解为"不进位的二进制相加".举个栗子:

1000111 和 1110001 异或

按照不进位相加的运算方法:最小位都是1 相加为2也就是10(二进制运算), 因为是不进位的运算 所以直接本位为0 就可以了,其他位如法炮制:0110110.

重要性质

异或运算符合交换律和结合律

交换律:a^b^c^d 和 a^d^c^b是一样的

结合律:a^b^c^d和a^(b^c)^d是一样的

0^N==N

N^N==0

应用场景

1.利用异或交换两个数

绝大多数这个操作都是没屁硌楞嗓子的无意义操作....它的好处就是不用申请额外空间完成操作,但是不用异或操作也可以实现不申请额外空间的交换(异或操作还有可能出错)---不创建临时变量交换两个变量传送门(可以看下这篇博客)

int a = 10;int b = 11;a = a^b;b = a^b;a = a^b;System.out.println(a);System.out.println(b);

这三个a^b你懵不懵?反正我第一次看见是挺懵的

设 a的初始值为x b的初始值为y

a = x^y

b = (x^y)^y 因为y^y为0 x^0为x 所以b中现在存储的数据为 x(交换完成)

a = x^y^x 同理 ==x

(寄!写着写着发现按值传递按址传递好不悬给忘了)

值得一提的是因为异或操作的性质,如果a和b是同一块内存的话 会导致最后交换结果为0

2.一个数组中有一个数出现了奇数次,其他数都出现了偶数次,找到并打印这个数

这题用性质做爽的一匹,直接把他们全都异或在一起就行了,根据结合律,出现偶数个的数全都异或在一起变成零,而奇数个数的数异或在一起会剩下一个,然后本身和0异或还是本身;

    public static int select(int arr[]) {        int sum = 0;        for(int i = 0;iain(String[] args) {        int [] arr = {1,1,1,1,3,3,3,3,3,5,5,5,5};        int a = select(arr);        System.out.println(a);}

3.取一个二进制数中的最后一个1

如1001110 取得就是倒数第二个

我们先设N是一个二进制数

N: 1 0 0 0 1 1 1 1 1 1 1

~N: 0 1 1 1 0 0 0 0 0 0 0(取反)

~N+1:0 1 1 1 0 0 0 0 0 0 1

然后把N和~N+1进行按位与(&)操作

得到 0 0 0 0 0 0 0 0 0 0 1

public static int selectlastone(int n) {        int n1 = ~n+1;        int s = n&n1;        return s;    }    public static void main(String[] args) {        int n = 10;        System.out.println(Integer.toBinaryString(n));//按二进制打印n        int a = selectlastone(n);        System.out.println(Integer.toBinaryString(a));//按二进制打印a}

4.一个数组中有两个数出现了奇数次,其他数都出现了偶数次,找到并打印这个数

public static int select(int[] arr) {            int eor = 0;            for (int i = 0; i < arr.length; i++) {                eor ^= arr[i];            }            int rightOne = (~eor+1)&eor; // 提取出最右的1        int onlyOne = 0;             for (int i = 0 ; i < arr.length;i++) {                if ((arr[i] & rightOne) != 0) {                    onlyOne ^= arr[i];                }            }            System.out.println(onlyOne);//onlyOne是其中一个            return eor ^ onlyOne;//返回的是另一个    }    public static void main(String[] args) {        int [] arr= {1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,4};        int a = select(arr);        System.out.println(a);}

设这两个单独的数分别为a b

先把所有数字都异或在一起 偶数消除掉 留下的是 a^b

a和b至少有一位是不同的 所以a^b里面至少有一个1 我们取出左右边的1 得到rightone

a或者b不同的话 这个位置上肯定其中一个是 1 一个是 0;

我们假设a这个位置上是1 b这个位置上是0

(反正除了我们要找的数以外都是偶数个,剩下的那些本位置为1的数是0个还是6个8个都不重要)

可以把这个数组分为两组 A组 这个位上为1的元素 B组 这个位上为0的元素

而在A组中 包含偶数个其他元素和奇数个a 所以再次转变成问题2求出onlyone

然后再有a^b = eor a^eor = b 求出另一个元素

5.求二进制数中有多少个1

    public static int onecount(int a) {            int count = 0;            while(a!=0) {                int rightone = ((~a)+1)&a;                count++;                a ^= rightone;            }            return count;    }    public static void main(String[] args) {        int a = 55;        int count = onecount(a);        System.out.println(count);}

用应用3轻松解决

来源地址:https://blog.csdn.net/chara9885/article/details/129659980

--结束END--

本文标题: Java-异或运算详解

本文链接: https://lsjlt.com/news/425106.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java-异或运算详解
    基本概念 异或运算,符号为XOR或者^,是二进制的运算,运算法则为相同为0,不同为1,我记得时候反正总会忘(和同或记反),所以这里直接把异或理解为"不进位的二进制相加".举个栗子: 1000111 和 1110001 异或 按照不进位...
    99+
    2023-10-08
    数据结构 java Powered by 金山文档
  • JAVA异或运算
    一、异或运算: 异或运算(^):是一种位运算(二进制),位相同为0,位不同为1。 既然这样,那当一个数对自身进行异或运算时,那么所有的数位都为0了,结果不就等于0了?测试一下: int a=2; System....
    99+
    2023-09-27
    java 开发语言
  • python 异或运算
    交换a,b两值的方法:                     a = a^b;                     b = a^b;                     a = a^b; b = a ^ b =...
    99+
    2023-01-31
    python
  • 深入理解java中的异或运算符
    Java中的位运算符中有一个叫做异或的运算符,符号为(^)或者 Xor异或8个字总结 相同出0 不同出1int a=1; int b=1; System.out.println(a^b);这里则输出 0int a=12; int b=0; ...
    99+
    2016-04-08
    java入门 java 异或 运算符
  • 详解Java的位运算
    目录位运算代码演示代码结果位运算的应用位运算 很久以前学习过位运算,但是很久不用,感觉都忘得差不多了。最近看了几处位运算的代码,发现都看不懂了,哈。也是时候回来补一补基础知识了。 程...
    99+
    2023-05-15
    Java位运算 Java运算
  • 详解JAVA之运算符
    目录一、算术运算符二、赋值运算符三、自增自减运算符四、关系运算符五、逻辑运算符六、三元运算符七、数据输入总结一、算术运算符 运算符:常见的±*/等 表达式:运算符连接起来符合java...
    99+
    2024-04-02
  • 探索Golang中的异或运算符
    Golang异或符是什么?来了解一下吧! 在Golang中,异或符号(^)是一种位运算符,用来对二进制数进行按位异或运算。异或运算符的运算规则是:对应的二进制位相同取0,不同取1。在Golang中,它不仅可以...
    99+
    2024-01-29
    Golang 了解 异或符
  • Java中的位运算与移位运算详解
    目录位运算按位“与” &按位“或” |异或 ^移位运算左移 <<右移 >>无符号右移 >>>总结位运算 按位“与” & ...
    99+
    2024-04-02
  • Java 中的位运算与移位运算详解
    位运算和移位运算是 Java 中常用的运算符,用于对数字的位进行操作。下面是位运算与移位运算的详细解释:1. 位运算符:- 按位与(...
    99+
    2023-08-14
    Java
  • js异或运算符^小技巧分享
    目录js异或运算符^小技巧js中的位运算符(按位与、按位或、按位异或)使用总结js异或运算符^小技巧 这个运算符主要是在位运算的时候使用,但是在普通的数也能使用,且有一个转换过程,即...
    99+
    2023-05-17
    js异或运算符 js运算符 异或运算符^
  • Java六类运算符详解
    目录算数运算符关系运算符逻辑运算符赋值运算符字符串连接运算符条件运算符在 Java 语言中,运算符有算数运算符、关系运算符、逻辑运算符、赋值运算符、字符串连接运算符、条件运算符。 算...
    99+
    2023-03-21
    算数运算符 关系运算符 逻辑运算符 赋值运算符 字符串连接运算符 条件运算符
  • 详解Java中的运算符
    本篇文章为大家展示了详解Java中的运算符,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java的运算符,分为四类:算数运算符、关系运算符、逻辑运算符、位运算符。算数运算符(9):+ - * / %...
    99+
    2023-05-31
    java 运算符 ava
  • Java利用位运算实现乘法运算详解
    目录前言正文十进制相乘二进制相乘思路分析代码实现总结前言 在上一篇中,我们介绍了使用位运算实现加法和减法运算,接下来本文主要介绍如何用位运算实现乘法运算,在实现乘法时要用位运算实现,...
    99+
    2023-05-15
    Java位运算实现乘法运算 Java位运算 乘法运算 Java位运算
  • Java利用位运算实现加减运算详解
    目录前言思路分析示例位运算进位初步结果去除加号整体思路加法代码实现减法实现减法分析减法代码实现总结前言 本文主要介绍如何使用位运算来实现加减功能,也就是在整个运算过程中不能出现加减符...
    99+
    2022-12-31
    Java位运算实现加减运算 Java 加减运算 Java位运算
  • python异或运算符的用途有哪些
    Python中的异或运算符(^)主要用于执行位运算。它可以在比特级别上执行异或操作,适用于处理数字中的比特位。 以下是异或运算符在P...
    99+
    2024-04-02
  • Java运算符优先级详解
    本篇内容介绍了“Java运算符优先级详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java运算符优先级详解 优先级是指同一式子中多个运算...
    99+
    2023-06-03
  • Java 运算符详情
    目录1、算术运算符2、关系运算符3、逻辑运算符4、位运算符5、赋值运算符6、条件运算符7、instanceof 运算符Java 中的运算符与 C 语言基本一致。 1、算术运算符 ...
    99+
    2024-04-02
  • python异或运算符使用要注意什么
    在使用Python中的异或运算符(^)时,需要注意以下几点: 异或运算符用来对两个数的二进制进行按位异或操作,即对应位上的数字相同...
    99+
    2024-04-02
  • python异或运算符的使用方法是什么
    ^ 是 Python 中的异或运算符,用于对两个数字进行按位异或操作。其使用方法如下: # 对两个数字进行按位异或操作 result...
    99+
    2024-04-02
  • Java双冒号(::)运算符使用详解
    目录1.说明2.先来说下@FunctionalInterface3. 下面来讲讲这个 "::"是干嘛的4. 建立一个Person类4:构建多个person对象,放入数组中,然后对数组...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作