May LeetCoding Challenge4 之 异或运算

& 两个位都为1时,结果才为1
| 两个位都为0时,结果才为0
^ 异或 两个位相同为0,相异为1
~ 取反 0变1,1变0
<< 左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

-------------------------------------------------------------

5 = 101

异或运算:1^0=1, 1^1=0, 0^0=0       所以 101^111=010=2

本题的关键是如何确定111,即如何确定有几个1。因为1的个数与5的二进制位数相等,所以问题变为如何确定5的二进制位数。

1.用数学运算方法确定 n = (int)(log(num)/log(2))+1

2.申请一个新的变量,通过位运算>>的方法确定位数

 

JAVA

class Solution {
    public int findComplement(int num) {
        int n = (int)(Math.log(num) / Math.log(2)) + 1;
        int bitmask = (1 << n) - 1;
        return num^bitmask;
    }
}

 

class Solution {
    public int findComplement(int num) {
        int todo = num;
        int bitmask = 1;
        while(todo != 0){
            num = num^bitmask;
            bitmask <<= 1;
            todo >>= 1;
        }
        return num;
    }
}

 

Python3

class Solution:
    def findComplement(self, num: int) -> int:
        n = floor(log2(num))+1
        bitmask = (1 << n) - 1
        return num^bitmask

 

class Solution:
    def findComplement(self, num: int) -> int:
        todo = num
        bitmask = 1
        while todo != 0:
            num = num^bitmask
            bitmask <<= 1
            todo >>= 1
        return num
posted @ 2020-05-04 19:50  yawenw  阅读(162)  评论(0编辑  收藏  举报