专栏首页CoffeeLand位运算之异或(XOR)
原创

位运算之异或(XOR)

Table of Contents

  • XOR是什么
  • XOR的运算规则
  • XOR的应用
  • References

XOR是什么

是计算机的逻辑异或运算

XOR的运算规则

相同为0, 不同为1

 1000 ^ 1001 的运算过程如下
 1001
 1000
=0001 

XOR的应用


判断两个数是否相等

通过判断两个数异或结果是否为0来判断两个数是否相等

int a=10,b=20,c=10;
a^b 不是0, 所以不相等
a^c 是0, 所以相等

不用第三个变量来交换两个数

        int a = 10;
        int b = 20;

        a = a^b;
        System.out.println("a = " + a);
        b = a^b;
        System.out.println("b = " + b);//10
        a = a^b;
        System.out.println("a = " + a);//20

        a = a ^ a;
        System.out.println("a = " + a); //0      

返回一个数的二进制形式的最右边的一个1

1010 最右侧1是0010

1100 最有测1是0100

二进制减法的一个特性

一个二进制数减1, 相当于把这个数的从最右侧的1开始flio翻转

1000 – 0001 = 0111

0100 – 0001 = 0011

1100 – 0001 = 1011

然后使用如下算法

x ^ (x & (x - 1))
// x-1 是为了找出最右侧1的位置, 
// x & (x - 1) 是将从右侧的位置开始的位置为0
// ^ 是根据相同为0, 不同为1, 最右侧之前的位置为0

HashMap的hash算法

 // java8的hashMap的hash
   static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
    //h >>> 16 是为了将高位移向地位
    //异或运算 是因为index = (n-1) & hash; n是数组的长度, 为了防止hash散列冲突
    //java7的是hash % n, java8用无符号右移是因为位运算快
  
  

References

https://hackernoon.com/xor-the-magical-bit-wise-operator-24d3012ed821

https://cloud.tencent.com/developer/article/1373928

喜欢我的文章, 请点赞!!! 喜欢我的文章, 请点赞!!! 喜欢我的文章, 请点赞!!!

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • hash散列 introduction

    hash散列是在记录的存储位置与他的关键字之间建立的对应关系f, 使得每个key都对应一个存储位置, 查找时根据key的hash去查找.

    CoffeeLand
  • BDD测试框架Cucumber

    最早的有TDD, 测试驱动开发, 而BDD 是行为驱动开发, 更加关注用户的行为,

    CoffeeLand
  • java系统问题之cpu占用过高

    系统负载(System Load)是系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度)。

    CoffeeLand
  • 2843 拯救炜哥

    2843 拯救炜哥 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一天,炜...

    attack
  • c# 读取 txt 文件中数据(int)

    今天在学图的算法做测试是,需要读取文本文件中的点坐标,本来很简单的事情,折腾了半天,记录一下找到的一种简单粗暴的解决方法,以便以后查看。

    用户2434869
  • 编程常用算法 --- C/C++ 语言实现(不定期更新)

    实际编程中,很多编程语言都帮我们实现了一些常用的较简单的算法,当然,在一些需求中,我们也需要自己实现一些算法,这里总结一些常用的算法,采用 C/C++ 语言实现...

    指点
  • Idea 使用 Junit4 进行单元测试

    Idea 默认使用 arquillian junit4 作为测试框架,我们将其更改为 Junit4。

    希希里之海
  • 装载问题——BFS(队列式)分支界限法

    AI那点小事
  • 栈(stack)

    栈是一个先入后出的有序列表,栈中的元素插入和删除只能在线性表的同一端进行。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底。...

    桑鱼
  • C#访问非托管DLL

    前段时间写了一个读卡器程序,使用到了一个DLL。在.NET 中调用DLL还是相当简单的。我也是转别人的代码,自己的不写。下面就是代码: C#中要使用动态链接库...

    用户1105954

扫码关注云+社区

领取腾讯云代金券