其他分享
首页 > 其他分享> > May LeetCoding Challenge 之 异或运算

May LeetCoding Challenge 之 异或运算

作者:互联网

& 两个位都为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

标签:LeetCoding,May,Challenge,Solution,int,bitmask,num,findComplement,todo
来源: https://www.cnblogs.com/yawenw/p/12827930.html