[算法整理]位运算

108 阅读1分钟

常见位操作

  1. |操作:将字符转换为小写

    或加空格,转为小写

    ('a' | ' ') = 'a'
    
    ('A' | ' ') = 'a'
    
  2. &操作:将字符转为大写

    且加下划线,转为大写

    ('a' & '_') = 'A'
    
    ('A' & '_') = 'A'
    
  3. ^操作:将字符进行大小写切换,判断异号

    异或加空格,实现大小写切换

    ('a' ^ '_') = 'A'
    
    ('A' ^ '_') = 'a'
    

    异或和0比较,判断是否为异号

    ((1^-1)<0);//true
    
    ((1^1)<0);//false
    

n&(n-1)的运用

意义:可以去除二进制最后一个1

运用:

  1. 191. 位1的个数 - 力扣(LeetCode)

我们可以使用n = n&(n-1),这样就可以让n一直去掉最后那个1,直到全部去掉为止(n === 0

var hammingWeight = function(n) {
    // 我们可以利用n&n-1
    // 每次都会消除最后一个1,知道没法消除为止
    let count = 0
    while(n !== 0){
        n = n&(n-1)
        count++
    }
    return count
};
  1. 231. 2 的幂 - 力扣(LeetCode)

记住:假如他是二的幂,那么在他的二进制中,一定含有1的

var isPowerOfTwo = function(n) {
    if(n<=0){
        return false
    }
    //在二进制表示中,一定只含有一个1
    return (n & (n - 1)) === 0
};

a^a = 0

异或是很重要的

异或可以进行大小写转换,进行判断同号问题

公式:

a ^ a = 0:本身和本身异或为0

a ^ 0 = a:和0异或变为变身

运用

136. 只出现一次的数字 - 力扣(LeetCode)

我们可以使用这个来判断,因为异或是不区分先后顺序的,但是我们可以排序更改好的理解

var singleNumber = function(nums) {
    // 判断,利用异或
    // nums.sort((a,b)=>a-b)
    // 异或这个操作,不分前后顺序
    let refValue = 0
    for(let value of nums){
        refValue ^= value
    }
    return refValue
};

参考链接

常用的位操作 :: labuladong的算法小抄

异或运算 XOR 教程 - 阮一峰的网络日志 (ruanyifeng.com)