精华内容
下载资源
问答
  • java的位运算符中有一个叫异或的运算符,用符号(^)表示,其运算规则是:两个操作数的位中,相同则结果为0,不同则结果为1。下面看一个例子:public class TestXOR{public static void main(String[] args){int i = ...

    java的位运算符中有一个叫异或的运算符,用符号(^)表示,其运算规则是:两个操作数的位中,相同则结果为0,不同则结果为1。下面看一个例子:

    public class TestXOR{

    public static void main(String[] args){

    int i = 15, j = 2;

    System.out.println("i ^ j = " + (i ^ j));

    }

    }

    运行结果是:i^j=13.

    分析上面程序,i=15转成二进制是1111,j=2转成二进制是0010,根据异或的运算规则得到的是1101,转成十进制就是13.

    利用这个规则我们可以灵活运用到某些算法。比如,假定有2K+1个数,其中有2k个相同,需要找出不相同的那个数,比如:2、3、4、4、3、5、6、6、5。我们利用异或运算符就可以这样写:

    public class TestXOR{

    public static void main(String[] args){

    int[] array = {2,3,4,4,3,5,6,6,5};

    int v = 0;

    for (int i = 0;i < array.length;i++) {

    v ^= array[i];

    }

    System.out.println("只出现一次的数是:" + v);

    }

    }

    结果是:只出现一次的数是2.

    我们就是巧用异或运算符的规则,得出一个数和0异或还是自己,一个数和自己异或是0的原理。

    上述计算方式:v=2^3^4^4^3^5^6^6^5;

    根据交换律以及上述规则

    可以推出只出现一次的数(需满足前提条件2k个相同)

    总结

    以上就是本文关于java中的异或问题代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

    展开全文
  • 二进制异或

    2013-09-16 17:57:07
    package demo; import java.util.ArrayList; public class pianyiliang { ... public static void main(String[] args) { ... //运算过程:首先把123十进制转换二进制(01111011),16进制20...
    package demo;
    

    import java.util.ArrayList;

    public class pianyiliang {
    public static void main(String[] args) {
    StringBuffer sb = new StringBuffer();
    //运算过程:首先把123十进制转换二进制(01111011),16进制20转换二进制(00100000)
    //然后对二进制做异或运算,运算结果再转换十进制,
    //运算规则,相同则0 相反则1,比如0^0=0 0^1=1 1^1=0
    sb.append(123^0x20);
    System.out.println(sb.toString());
    }
    }
    展开全文
  • java 二进制以及二进制运算

    千次阅读 2019-01-09 23:02:50
    虽然现在很少用到二进制,可是一些源码中会经常遇到,比如: //HashMap中的hash方法: static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h &gt;&gt;&...

    虽然现在很少用到二进制,可是一些源码中会经常遇到,比如:

    //HashMap中的hash方法: 
    static final int hash(Object key) {
            int h;
            return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
        }

    这里记录一些二进制知识。

    一:负数如何显示其二进制。

    比如5的二进制数为:00000000  00000000 00000000 00000101(int 类型占用4个字节,每个字节8位).

    那么-5的二进制是多少了。对于负数,这里需要理解反码和补码
    1、所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
    2、反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外
    原码10010= 反码11101 (10010,1为符号码,故为负)
    (11101) 二进制= -13 十进制
    3、补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
    举一例,我们来看整数-5在计算机中如何表示。
    假设这也是一个int类型,那么:
    1、先取1的原码:00000000 00000000 00000000 00000101
    2、得反码: 11111111 11111111 11111111 11111010
    3、得补码: 11111111 11111111 11111111 11111011

    可以在控制台输出测试:

    输出-5的二进制数
    System.out.println(Integer.toBinaryString(-5));// 11111111 11111011

    二:二进制常用的运算。(^异或运算,与运算&,|运算,左移运算<<,右移运算(有符号)>>,无符号又移>>>)

    1.^异或运算。二进制数 相同为0.不同为1;

    /**
    	 *  ^异或运算。二进制数 相同为0.不同为1; 
    	 */
    	@Test
    	public void testOr(){
    		int first=3;//                  0011------------3
    		int second=4;//                 0100------------4
    		int three=first^second;//       0111------------7
    		System.out.println(three);//7
    	}

    2.&运算。只有都为1时才为1.否则为0

    @Test
    	/**
    	 * 二进制数 只有都为1时才为1.否则为0
    	 */
    	public void testAnd(){
    		int first=12;//-----------------00001100   值为 12
    		int second=22;//----------------00010100   值为 22
    		int three=first&second;//-------00000100   值为 4
    		System.out.println(three);//---4
    	}

    3.|运算。(参加运算的两个对象只要有一个为1,其值为1。)

    @Test  //(参加运算的两个对象只要有一个为1,其值为1。)
    	public void testOrAnd(){
    		System.out.println(5|2);//7
    		System.out.println(Integer.toBinaryString(5));// 00000000 00000000 00000000 00000101
    		System.out.println(Integer.toBinaryString(2));// 00000000 00000000 00000000 00000010
    		System.out.println(Integer.toBinaryString(7));// 00000000 00000000 00000000 00000111
    	}

    4.左移运算(<<)

       如果是整数,直接转为二进制数进行左移,低位补0.

      如果是负数。首先也要转为二进制数(通过反码,补码机制)。转移完后,将二进制数加一,取反码。得最终的结果

      下面给的例子是 -5<< 结果为20.

    /**
    	 * 左移运算(<<)   二进制数向左移动,低位用0补齐
    	 * 反码是除符号位(最高位)外取反
    	 */
    	@Test
    	public void testLeftMove(){
    		int first=33;//              00100001 值为33
    		int two=first<<2;//          10000100 值为132
    		System.out.println(two);  //132
    		//如果是负数
    		//-5 的二进制,先是算5 的二进制       00000000 00000000 00000000 00000101  然后进行取反(除最高位外)
    		//-5的反码是                        11111111 11111111 11111111 11111010
    		//   补码    反码+1                 11111111 11111111 11111111 11111011
    		//-----------------------------------计算 -5<<2的值----------------------------
    		//首先-5的补码左移两位,低位补0得:
    		//                              11111111 11111111 11111111 11101100
    		//然后 减一得:
    		//                             11111111 11111111 11111111 11101011
    		//最后取反即可:
    		//                             00000000 00000000 00000000 00010100  值为20
    		  System.out.println(-5<<2);//20
    		System.out.println(Integer.toBinaryString(-5));//11111111 11111111 11111111 11111011
    	}

    5.右移运算(>>).如果是正数,高位补0.如果是负数,高位补1。

        都是先转换为二进制再进行位移运算。如果是负数,也是要借助反码和补码。

    /**
    	 * 右移(>>) 二进制数整体向右移动。如果是正数,高位补0.如果是负数,高位补1
    	 */
    	@Test
    	public void testRightMove(){
    		//-5的二进制       11111111 11111111 11111111 11111011
    		//右移1位              11111111 11111111 11111111 111111101
    		
    		System.out.println(-5>>1);//-3    
    		System.out.println(Integer.toBinaryString(-3));//11111111111111111111111111111101
    		
    		System.out.println(-2147483647>>5);
    		System.out.println(Integer.toBinaryString(-2147483647>>5));
    		System.out.println(Integer.toBinaryString(-2147483647));
    	}

    6.无符号的右移运算(>>>)

      即无论是正数还是负数,高位都补0.

    下面代码可见>>>运算不再采用补码和反码机制了。不管是正数还是负数,最终都是正数。所以直接    将转移后的二进制转换为正数。如果是负数采用>>>的话,也为正数了。

    	/**
    	 * 无论正负高位同一补0。
    	 */
    	@Test
    	public void testRightMoveThree(){
    		System.out.println(-5>>>2);                               //1073741822
    		System.out.println(Integer.toBinaryString(-5));           //11111111 11111111 11111111 11111011
    		System.out.println(Integer.toBinaryString(1073741822));//   00111111 11111111 11111111 11111110
    	}

     

    展开全文
  • java二进制相关基础

    2017-12-05 12:12:02
    之前在JVM菜鸟进阶高手之路十(基础知识开场白)的时候简单提到了二进制相关问题,最近在看RocketMQ的源码的时候,发现涉及二进制的内容蛮多,jdk源码里面也是有很多涉及到二进制相关的操作,今天这篇文章仅仅是...

    转载请注明原创出处,谢谢!

    说在前面

    之前在JVM菜鸟进阶高手之路十(基础知识开场白)的时候简单提到了二进制相关问题,最近在看RocketMQ的源码的时候,发现涉及二进制的内容蛮多,jdk源码里面也是有很多涉及到二进制相关的操作,今天这篇文章仅仅是扫盲篇,后续会介绍灵活运用篇。

    说明

    任何东西都有规范,提到JAVA就会提到2个规范,JAVA语言规范、JVM规范。JAVA语言规范主要定义JAVA的语法、变量、类型、文法等等,JVM规范主要定义Class文件类型、运行时数据、帧栈、虚拟机的启动、虚拟机的指令集等等。

    • JAVA语言规范主要定义什么是JAVA语言。
    • JVM规范主要定义JVM内部实现,二进制class文件和JVM指令集等。

    规范中数字的内部表示和存储

    JAVA八种基本数据类型:
    整形:byte,short,int,long
    浮点型:float,double
    布尔型:boolean
    字符型:char

    数据类型所占位数
    int32bit
    short16bit
    long64bit
    byte8bit
    char16bit
    float32bit
    double64bit
    boolean1bit

    **备注:**1字节=8位(1 byte = 8bit)

    整数的表示

    • 源码:第一位为符号位(0表示正数,1表示负数)。
    • 反码:符号位不动,原码取反。
    • 负数补码:符号位不动,反码加1。
    • 正数补码:和源码相同。
      备注:补码的好处:
      - 使用补码可以没有任何歧义的表示0。
      - 补码可以很好的参与二进制的运算,补码相加符号位参与运算,这样就简单很多了。

    浮点数表示

    在上图中,我们了解到Float与Double都是支持IEEE 754

    我们以float来说明:

    IEEE754单精度浮点格式共32位,包含三个构成字段:23位小数f,8位偏置指数e,1位符号s。将这些字段连续存放在一个32位字里,并对其进行编码。其中0:22位包含23位的小数f; 23:30位包含8位指数e;第31位包含符号s。

    一个实数V在IEEE 754标准中可以用V=(-1)s×M×2E 的形式表示,说明如下:
    - 符号s(sign)决定实数是正数(s=0)还是负数(s=1),对数值0的符号位特殊处理。
    - 有效数字M(significand)是二进制小数,M的取值范围在1≤M<2或0≤M<1。
    - 指数E(exponent)是2的幂,它的作用是对浮点数加权。

    符号位指数位小数位
    1位8位23位

    例如根据IEEE754,计算11000001000100000000000000000000的单精度浮点的值。

    解题:

    11000001000100000000000000000000
    符号位指数尾数由于指数不是全部为0 所以小数位附加1
    110000010**1.**00100000000000000000000
    -12^(130-127)(2^0 + 2^-3)

    结论:
    -1 * (2^0 + 2^-3) * 2^(130-127) =-9

    同样,你也可以验证一下十进制浮点数0.1的二进制形式是否正确,你会发现,0.1不能表示为有限个二进制位,因此在内存中的表示是舍入(rounding)以后的结果,即 0x3dcccccd, 十进制为0.100000001, 误差0.000000001由此产生了。

    说到这里JVM菜鸟进阶高手之路十(基础知识开场白)的有些问题其实都解答了,所以涉及到钱的小数类型必须使用BigDecimal,禁止使用float和double。

    进制的概念

    我们常用的进制有二进制、八进制、十进制和十六进制,十进制是最主要的表达形式。

    二进制是0和1;八进制是0-7;十进制是0-9;十六进制是0-9+A-F(大小写均可)。

    位运算符

    按位与(&)

    **两位全为1,结果才为1:**
    0&0=00&1=01&0=01&1=1
    **用法:** - 清零:如果想要一个单位清零,那么使其全部二进制为0,只要与一个各位都为零的数值想与,结果为零。 - 取一个数中指定位:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。 例如:设X=1010 1110,取X的低4位,用X & 0000 1111 = 0000 1110 就可以得到。

    按位或(|)

    **只要有一个为1,结果就为1:**
    0|0=00|1=11|0=11|1=1
    **用法:**常用来对一个数据的某些位置1;找到一个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。 例如:将X=1010 0000 的低四位置1,用X | 0000 1111 =1010 1111 就可以得到。

    异或运算(^)

    **两个相应位为“异”(值不同),则该位结果为1,否则为0: **
    0^0=00^1=11^0=11^1=0
    **用法:** - 使特定位翻转:找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或就可以得到; 例如:X=1010 1110,使X低4位翻转,用X ^ 0000 1111 = 1010 0001就可以得到 - 与0相异或,保留原值 例如:X ^ 0000 0000 = 1010 1110 - 两个变量交换值的方法: 1、借助第三个变量来实现: C=A; A=B; B=C; 2、 利用加减法实现两个变量的交换:A=A+B; B=A-B;A=A-B; 3、用位异或运算来实现:利用一个数异或本身等于0和异或运算符合交换律 例如:A = A ^ B; B = A ^ B; A = A ^ B;

    取反运算(~)

    对于一个二进制数按位取反,即将0变1,1变0: ~1=0; ~0=1;

    左移运算(<<)

    • 将一个运算对象的各二进制位全部左移若干位(左边的二进制丢弃,右边补零)
      2<<1 = 4 : 10 <<1 =100=4
    • 若左移时舍弃的高位不包括1,则每左移一位,相当于该数乘以2。
      -14(二进制:1111 0010)<< 2= (1100 1000) (高位包括1,不符合规则)

    右移运算(>>)

    将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。操作数每右移一位,相当于该数除以2.

    左补0 or 补1 得看被移数是正还是负。
    例:4 >> 2 = 1
    例:-14(1111 0010) >> 2 = -4 (1111 1100 )

    无符号右移运算(>>>)

    各个位向右移指定的位数。右移后左边突出的位用零来填充。移出右边的位被丢弃
    各个位向右移指定的位数。右移后左边突出的位用零来填充。移出右边的位被丢弃
    例如: -14>>>2
    即-14(1111 1111 1111 1111 1111 1111 1111 0010)>>> 2
    =(0011 1111 1111 1111 1111 1111 1111 1100)
    = 1073741820

    Java打印整数的二进制表示

    int a = 1120429670;
    for (int i = 0; i < 32; i++) {
        int t = (a & 0x80000000 >>> i) >>> (31 - i);
        System.out.print(t);
    }

    说明:
    - 0x80000000是数的十六进制表示,转成二进制表示为10000000000000000000000000000000
    - 运算的优先级,移位运算高于逻辑运算,>>>高于&
    - 位逻辑与运算 1&1 = 1 ,0&1 = 0
    - >>>无符号右移,移出部分舍弃,左边位补0;

    欢迎积极留言讨论关于你在实际运用中了解到二进制的一些优秀实践,期待你的留言!!!

    如果读完觉得有收获的话,欢迎点赞、关注、加公众号【匠心零度】。


    个人公众号,欢迎关注,查阅更多精彩历史!!!
    匠心零度公众号

    展开全文
  • 比如说发报文的时候厂家设备要求要进行计算校验互相异或,规定报文是AA 55 04 00 02 DA(16进制的),然后根据报文计算出异或校验和(根据一下代码计算)为:23 。所以组合最终发送的报文 :AA 55 04 00 02 DA 23。 ...
  • 在计算机系统中,数值一律使用补码来表示和存储。... 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。比如,十进制...
  • JAVA二进制基础

    2017-11-09 15:10:52
    二进制与进制转换 二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”...当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码
  • java二进制运算符

    2020-05-17 00:12:13
    一、二进制 二进制(binary)在数学和数字电路中指以2为基数的记数系统 计算机的二进制中用 0表示正数 1表示负数 十六进制:有一个前缀0X或0x 八进制:前缀是0,最好不用,容易混淆 二进制:前缀是0b或0B 二进制...
  • Java二进制操作

    2019-03-25 18:31:35
    Java中,这对应着<<和>>这两个操作符,示例如下: 1 2 3 4 5 6 7 8 9 10 11 /* 00000001 << 1 = 00000010 */ 1 <<...
  • Java二进制浅谈

    2021-01-26 17:43:30
    Java二进制浅谈主题为什么Java里>>叫右移,<<叫左移,又是怎么运算的在Java里常见的HashMap中的运用 主题 左移右移 为什么Java里>>叫右移,<<叫左移,又是怎么运算的 右移即向右移一位,在运算...
  • java二进制运算

    2020-08-20 18:57:25
    在讲二进制运算之前,首先得知道原码,反码,补码的概念。举个例子。 二进制运算 & 按位逻辑与,都为1则为1,否则为0; | 按位或,都为0则为0,有一个为1则为1; ^ 异或,两个都相同为0,两个不相同为1,11=0...
  • java 二进制与运算符

    2021-04-10 10:07:16
    二进制 十进制 1 2 4 8 16 32 二进制 1 10 100 1000 10000 100000 图1 图1是做进制运算时候,方便计算的一...
  • java二进制,原码、反码、补码、位运算 二进制计数法的概念 人们在日常生活中和生产实践中,我们接触到越来越多的数字,创造了分组计数的制度.而我们的生活中,一般采用了”满十进一”的十进制计数法, 我们现在已经...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • Time Limit : 3000/1000ms (Java/Other)MemoryLimit : 65535/32768K (Java/Other) Total Submission(s) : 13Accepted Submission(s) :11 Problem Description 奇异王国里有很多奇怪的事物。比如奇怪的人(每个人都...
  • java二进制,运算符算法说明

    千次阅读 2015-12-09 14:44:19
    int 10的二进制:1010, 算法为1*2^3+0*2^2+1*2^1+0*2^0=10; 对于有负号的数 二进制的最高位时符号位:0表示正数,1表示负数 正数的原码,反码,补码都一样 负数的反码=它的原码符号位不变,其它位取反 负数的补码=...
  • Java二进制运算

    千次阅读 2017-03-12 16:09:32
    位运算:左移位:* 00000001 */ 1 * 00000001 */ 1 右移位:>> 是有符号操作符,使用最高位来表示数值的...一个以1开头的二进制数移位后还将以1开头,一个以0开头的二进制树移位后还将以0开头。/* 11111111 11111111 11
  • java 二进制相关

    2018-01-07 20:47:04
    与运算 负数以及正反补码 或运算 取反运算 无符号右移运算 异或运算 右移运算 左移运算
  • 按位与、或、非、异或、左移、右移、无符号右移
  • 一、二进制 二进制的最高位是符号位(整数是0,负数是1) Java中没有无符号数 计算机以整数的补码进行计算 原码:将一个整数转换为二进制 以int类型为例,int类型在Java中是4个字节,32位 例如: 2 的原码:...
  • 分析上面程序,i=15转成二进制是1111,j=2转成二进制是0010,根据异或的运算规则得到的是1101,转成十进制就是13.利用这个规则我们可以灵活运用到某些算法。比如,假定有2K+1个数,其中有2k个相同,需要找出不相同的...
  • java二进制操作计算的总结

    千次阅读 2019-03-17 07:52:26
    一直以来对二进制的操作计算不太清楚,这次找了一些资料完整地进行了一些总结。 一、进制类别和关系: 二进制,十进制,十六进制的区别和进制之间的相互转换方法(概念性的东西,可以百度)。 n位的二进制能够表示...
  • 一,二进制的算法 是将一个数进行处于2得到的余数1,或0进行收集! 余数收集是从最下向上进行依次排列 如: 5的二进制应该是:0000 0101 而转化为十进制应该是:从最低为乘以2的0次方开始依次进行相加 最低为: 从左...
  • Java二进制指令代码大全

    千次阅读 2019-02-26 22:03:45
    Java指令集(按功能分类) 常量入栈指令 操作码(助记符) 操作数 描述(栈指操作数栈) aconst_null   null值入栈。 iconst_m1 ...
  • 一、java二进制、八进制、十进制、十六进制相互转换: 二进制转十进制 Integer.parseInt("0110", 2); 八进制转十进制 Integer.parseInt("17", 8); 十六进制转十进制 Integer.parseInt("17", 16); 十进制转成...
  • 二进制、位运算、位移运算 思考题 1、请看下面的代码段,回答a,b,c,d,e结果是多少? public static void main(String []args){ int a=1&gt;&gt;2; int b=-1&gt;&gt;2; int c=1&lt;...
  • 2017年河北省大学生程序设计竞赛 奇妙糖果屋 【二进制+异或】 奇异王国里有很多奇怪的事物。比如奇怪的人(每个人都拥有一个智慧值),奇怪的商店...... 这不,奇异糖果屋今天开业了,老板在门口拉上了“糖果送送送”...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,219
精华内容 10,887
关键字:

java二进制异或

java 订阅