`

java异或运算备忘

阅读更多
java异或运算虽然不常用,但偶尔在系统中会看到,这里备忘一下,其基本原理如下:

    真^假=真  
    假^真=真  
    假^假=假  
    真^真=假,
就是说:只要两个条件同时为真或假,其结果都为假(这里要注意区别Java的与运算---其为真真为真,假假为假);
但仅当两条件中一个为真,另一个为假时,结果为真。
但Java的异或运算还有一个前提那就是它都是以二进制数据为基础进行的运算。
也就是说当我们在使用代码中使用到异或运算时,它都会先将两个条件进行转换,转换成二进制数据后,再进行运算,例如:
int a = 4^6;这里的4和6 都是int型数据,在进行运算时,4对应的二进制数为:100(0100);6对应的是:110(0110),这样实际的运算方程是:int a = 0100^0110;此时再来看:0<-->0=0;1<-->1=0;0<-->1=1;0<-->0=0;这样运算的结果就是:0010(这是二进制的数据),对应转换成十进制就是2.
    以上就是Java里面对于异或运算的内部运算机制。


下面看下异或解决两个实际的问题:

1

如果要把两个整型变量a、b的值交换,一般要采用一个中间变量做过渡,但也可以在不借助任何其它变量的情况下完成。试填写缺失的代码。
a = a ^ b;
b = _________;

a = _________;

真异或真为假,假异或假为假 || 真异或假为真,假异或真为真,

答案即

a=a ^ b;
b=a ^ b;
a=a ^ b;

2.100个数,范围是1~99 ,其中有一个重复,求重复的数字

有一个数组a[100],其中存储了1-99的整数,且只有一个数字是重复的。

要求告终一个算法给出这个重复的数。

题目的含义是总共同100个数字,1-99定然都有,然后有一个数是重复的。



措施1:有个结论如下:1^2^3……98^99 = 0,因而该题目能够利用这个规律。

对所有的数据举行异或计算,最后的收获即便重复的数字。(当然你可以用其他方法来求解这个题,如求和再减去1到99的和或者其他方法)

note:

一个规律:在异或到N得过程中(1^2^3^……^N),N = 4M,则异或结果为4M,N = 4M - 1,则异或结果为0,N = 4M - 2,则异或结果为4M - 1,N = 4M - 3,则异或结果为1.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics