zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    日期时间基本知识
    VScode 常用操作
    js实现图片的Blob base64 ArrayBuffer 的各种转换
    window.postMessage()实现(iframe嵌套页面)跨域消息传递
    软件工程概论个人总结
    软件工程学习进度表(第十六周)
    《构建之法》阅读笔记
    软件工程学习进度表(第十五周)
    《人月神话》阅读笔记06
    《人月神话》阅读笔记05
  • 原文地址:https://www.cnblogs.com/yawenw/p/12827930.html
Copyright © 2011-2022 走看看