Java-异或运算详解

这篇具有很好参考价值的文章主要介绍了Java-异或运算详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本概念

异或运算,符号为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;i<arr.length;i++) {
            sum^=arr[i];
        }
        return sum;
    }

    public static void main(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://www.toymoban.com/news/detail-467084.html

到了这里,关于Java-异或运算详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 异或运算在算法中的神奇应用

    两个二进制数进行异或运算时,每一位上的数相同则结果为0,不同则结果为1。 简单记:异或就是二进制的无进位相加。 还有个同或运算:相同为1,不同为0,和异或是反的。 任何数与0异或,结果还是这个数:0^n=n 任何数与自身异或,结果都是0:n^n=0 异或运算满足交换律和

    2024年04月08日
    浏览(43)
  • 位运算(按位与、按位或、异或、取反)以及原码、反码、补码

    目录 位运算 按位与运算符 [ ] 按位或运算符 [ | ] 异或运算符 [ ^ ] 取反运算符 [ ~ ] 移位操作 一些面试常考的位操作运算 获取二进制中最右边的1 计算机原码、反码、补码 机器数 “三码”之间的转换 计算机中为啥要用补码呢? 真数 原码 反码 补码 有了原码为什么要使用反码

    2024年02月02日
    浏览(48)
  • C语言:位运算符----与(&),或(|),非(~),异或(^),左移(<<)和右移(>>)

    C语言 基础开发----目录 位运算符 就是按二进制位进行运算。 C语言中位运算符主要包括六种,具体如下: 与(),或(|),非(~),异或(^),左移()和右移() 位运算符 含义 说明 按位 与 有0为0,双1为1: 11=1,10=0,01=0,00=0 只有两者对应位都为 1 ,结果对应位才为 1 ,否则为 0 I 按

    2024年01月18日
    浏览(49)
  • C#的几种位操作运算,与、或、非、异或、左移、右移

    C#的常见几种位操作运算,与($)、或(|)、非(~)、异或(^)、左移()、右移() 位操作一般来说比加减乘除计算要快一些 与()操作符的位都为1时,才为1,其他都为0,因此与()操作符的结果范围在[0, Math.Min(x,y)],x,y均为正整数 或(|)操作符的位都为0时,才为0,其他都为1,因此或(|)操作

    2024年02月16日
    浏览(35)
  • 计算机中的逻辑运算(与、或、非、异或、同或、与非、或非)

    计算机中的逻辑运算又被称作为“布尔运算”,分别为: 与 、 或 , 非 , 异或 。此外在门电路中还有: 同或 、 与非 、 或非 。共七种。 这七种逻辑运算中,只有 逻辑非运算 是一元逻辑运算(一个运算操作数),其他六种均是二元逻辑运算(两个运算操作数)。 逻辑运

    2024年02月08日
    浏览(40)
  • 【动态规划】【位运算】1787. 使所有区间的异或结果为零

    【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 动态规划汇总 位运算 给你一个整数数组 nums​​​ 和一个整数 k​​​​​ 。区间 [left, right](left = right)的 异或结果 是对下标位于 left 和 right(包括 left 和 right )之间所有元素进行 XOR 运算的结果

    2024年03月17日
    浏览(37)
  • 位运算:按位与、按位或、按位异或、按位左移、按位右移

    目录 一、基础知识补充     (1)位运算     (2)二进制的详细操作 二、位运算     (1)按位与()     (2)按位或(|)     (3)按位异或(^)       (4)按位左移()     (5)按位右移() 三、位运算例题     题目描述:     题解: 四、共勉     位运算符要比一般

    2024年02月03日
    浏览(44)
  • WAF攻防-权限控制&代码免杀&异或运算&变量覆盖&混淆加密&传参

    webshell检测平台 https://scanner.baidu.com/#/pages/intro https://ti.aliyun.com/#/webshell 对比工具代码-菜刀蚁剑冰蝎哥斯拉等 对比WAF规则-函数匹配工具指纹等 1.php 传参带入 ?a=ass x=cGhwaW5mbygpOw== 2.php 变量覆盖 x=cGhwaW5mbygpOw== 3.php 加密变异 http://www.phpjm.net/ 4.php 异或运算 5.php 脚本生成器 Webshel

    2023年04月11日
    浏览(44)
  • JAVA----基本类型与运算

    目录 一、Java提供了哪些基本数据类型? 二、在Java语言中null值是什么?在内存中null是什么? 三、如何理解赋值语句String x=null? 四、int和Integer有什么区别? 五、什么是不可变类 六、在Java语言中,类型转换有哪几种类型? (1)类型自动转换 (2)强制类型转换 七、 强制

    2024年02月16日
    浏览(28)
  • TCP/IP详解——网络基本概念

    网络最开始是为了数据通信。 以前通过ARPA网络,卫星来实现几个计算机的互相通信。 IBM推出自己的网络协议,这时网络没有标准。 1977年:TCP/IP标准。 1980年:ARPAnet全面向TCP/IP迁移。 1984年:ISO-网络标准,国籍标准化组织机构-定制各行各业的标准。 OSI开放式系统互联,同时

    2024年02月05日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包