zoukankan      html  css  js  c++  java
  • 位运算

    常用符号

    • & 与:两个位都为1,结果才为1
    • | 或:两个位都为0,结果才为0
    • ^ 异或:两个位相同为0,不相同为1
    • ~ 取反
    • << 左移:左移若干位,高位丢弃,低位补0
    • 右移:右移若干位,低位丢弃,高位补0或者符号位(取决于编译器)

    常用的位运算操作

    • x&1 :判断奇偶,若结果为1,则为奇数,否则为偶数
    • x = x & (x-1): 清除最低位的1
    • abc = acb = a(bc):异或运算的交换/结合律
    • a^a=0:任何数与自身做异或运算,结果为0
    • a^0=a:任何数与0做异或运算,结果为自身

    相关题目

    Leetcode(191):位1的个数

    image-20201110090655013

    利用 x=x&(x-1),可以不断地清除最低位的1,直到x所有位都为0

    代码如下:(Javascript)

    /**
     * @param {number} n - a positive integer
     * @return {number}
     */
    var hammingWeight = function(n) {
        let count=0
        while(n!==0){
            n = n & (n-1)
            count++
        }
        return count
    };
    

    LeetCode(231):2的幂

    image-20201110091028534

    对于2的整数幂来说,他们的二进制表达式都只有1位为1

    因此,作一次 x=x&(x-1)操作,再判断x是否为0即可

    代码如下:(Javascript)

    /**
     * @param {number} n
     * @return {boolean}
     */
    var isPowerOfTwo = function(n) {
        if(n<=0){
            return false
        }
        n=n&(n-1)
        
        return n===0 ? true : false
    };
    

    LeetCode(136):只出现一次的数字

    image-20201110091348157

    方法一:哈希表/集合

    集合的常用方法:

    • 创建一个新的空集合:var s = new Set()
    • 查找集合中是否有某个元素:s.has(value)
    • 向集合中添加新元素:s.add(value)
    • 从集合中删除某元素:s.delete(value)

    遍历数组,判断当前元素是否在集合中

    若不在,则将其放入集合中

    若在,则将其删除

    最后取出集合中唯一的一个元素即可

    这种方法使用了额外的空间,并不是最优解

    方法二:异或运算

    题目告诉我们,给定的数组一定是由n对元素和一个落单的元素组成的

    假设有2m+1个元素,那么对他们都进行异或运算

    由于任何数与自身异或 结果都为0,因此前2m个数的运算结果为0

    第2m+1个数 与0异或 结果为自身

    代码如下:(Javascript)

    /**
     * @param {number[]} nums
     * @return {number}
     */
    var singleNumber = function(nums) {
        let res=nums[0]
        for(let i=1;i<nums.length;i++){
            res=res^nums[i]
        }
        return res
    };
    
  • 相关阅读:
    查看linux版本的三种常用方法
    CentOS和Redhat发行版linux内核版本的对应关系
    swift的异常处理:本质是错误信息的传递方式
    构建法则第一条:有什么材料做什么饭
    待解决问题 代码阅读
    iOS: 聊聊 Designated Initializer(指定初始化函数):NS_DESIGNATED_INITIALIZER
    整合与构建的能力是创造性思维的重要体现
    iOS网络缓存的系统实现是一个烂尾工程
    (动态)代理于HOOK的区别于关系
    iOS 网络缓存总结
  • 原文地址:https://www.cnblogs.com/baebae996/p/13952156.html
Copyright © 2011-2022 走看看