xor如何确定哪个int是不同的?

jhdbpxl9  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(627)

这就是正在解决的问题
“给你三个整数,a,b和c。保证其中两个整数相等。第三个整数的值是多少?”
这是密码

int extraNumber(int a, int b, int c) {
    return a^b^c;
}

我理解插入符号“^”的意思是“异或”,简单来说就是“这个或那个,但不是两者”,但我不明白的是,这段代码是如何确定哪个int与其他int不同的,或者我没有正确理解“异或”?

xesrikrc

xesrikrc1#

从位级别来看:
价值观 x 与自身异或ed将始终导致0(检查: 1^1=0 以及 0^0=0 ).
价值观 y 与0进行异或运算将始终得到相同的值 y (检查: 1^0=1 以及 0^0=0 ).
因为它适用于单个位和 int 只有32位,完全相同的规则也适用 int 价值观。
因此,该方法不需要找出“哪些值不同”,因为用cancel out对一个值进行xor,然后用0对“剩余”值进行xor,只会返回相同的值。

46scxncf

46scxncf2#

joachim的答案是正确的,为了用一个例子来补充更多的细节,假设您向方法传递了三个参数(2,3,2),通常是位级格式 ...16 8 4 2 1 从右边开始,根据xor的真值表,
https://en.wikipedia.org/wiki/xor_gate

private int extraNumber(int a, int b, int c) {
        // 8421  -> this is bit level, 
        // let's compare a^b

        // 0010 = 2 (a value)
        // 0011 = 3 (b value, sum of 2nd + 1st bits)

        // 0001 = 1 (after XOR with a^b)
        // 0010 = 2 (c value)

        // 0011 = 3 (the final output)

        return a^b^c;
    }
3vpjnl9f

3vpjnl9f3#

您还可以通过将代码a^b^c分解为两个语句来检查中间结果。
例如

int a = 0b1010_1010;
int b = 0b1010_1010; //same value as b

int c = 0b1111_0000; //the remaining item

//CASE 1 (xor the different values first)
int d = a^c; //  results in 0b0101_1010
int e = d^b; // results in 0b1111_0000 (the answer) 

//CASE 2 (xor the same values first)
int d = a^b; // results in 0b0000_0000
int e = d^c; // results in 0b1111_0000 (the answer)

相关问题