实战技巧位运算

简介: 实战技巧位运算


为什么需要位运算

机器采用二进制对数值进行表示、存储和运算

在程序中恰当地使用二进制,可以提高运行效率

位运算符

异或运算(xor)

相同为0,不同为1

也可用“不进位加法”来理解

异或运算的特点与应用:

指定位置的位运算

二进制数的最右边为第0位

获取×在二进制下的第n位(0或者1) :(x >>n)& 1

将×在二进制下的第n位置为1:x |(1<

将×在二进制下的第n位置为0: x&(~(1 <

将×在二进制下的第n位取反:x^(1 <

将×最右边的n位清零:x&(~0<

将×最高位至第n位(含)清零:x&((1<

位运算实战要点

判断奇偶:

  • x % 2 == 1 →(x & 1)== 1
  • x% 2 == 0 (x & 1)== 0

.

除以2的幂次:

  • x/2 → x>> 1
  • mid = (left + right)/ 2; →mid =(left + right) >> 1;

lowbit:

  • 得到最低位的1: x &-x或x&(~x+ 1)
  • 清零最低位的1∶ x=x &(x- 1)

实战

https://leetcode.cn/problems/number-of-1-bits/

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int cnt = 0;
        while(n > 0){
            if((n & 1) == 1) cnt++;
            n = n >> 1;
        }
        return cnt;
    }
};
class Solution {
public:
    int hammingWeight(uint32_t n) {
        int cnt = 0;
        for(int i = 0; i < 32; i++){
            if((n >> i) & 1) cnt++;
        }
        return cnt;
    }
};
class Solution {
public:
    int hammingWeight(uint32_t n) {
        int cnt = 0;
        while(n > 0){
            cnt++;
            n = n & (n - 1);
        }
        return cnt;
    }
};

https://leetcode.cn/problems/power-of-two/

class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n > 0 && (n & -n) == n;
    }
};

https://leetcode.cn/problems/reverse-bits/

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t ans = 0;
        for(int i = 0; i < 32; i++){
            ans = (ans << 1) | (n >> i & 1);
        }
        return ans;
    }
};

https://leetcode.cn/problems/counting-bits/

class Solution {
public:
    vector<int> countBits(int n) {
        vector<int> cnt(n + 1, 0);
        for(int i = 1; i <= n; i++){
            cnt[i] = cnt[i & (i - 1)] + 1;
        }
        return cnt;
    }
};


推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

相关文章
|
6月前
|
存储 Java
面试官:你真的搞清位运算了么?
面试官:你真的搞清位运算了么?
46 0
|
算法
基础算法:位运算
基础算法:位运算
54 0
|
5月前
|
存储 自然语言处理 算法
位运算入门及简单算法题的应用
位运算入门及简单算法题的应用
47 1
|
5月前
|
C语言
C语言中求x的n次方:从入门到实践(保姆式教学)
C语言中求x的n次方:从入门到实践(保姆式教学)
411 0
|
6月前
|
C#
C位运算符精讲:提升编程效率的秘诀
C位运算符精讲:提升编程效率的秘诀
38 0
|
6月前
|
C语言 索引
位运算修行手册(二)
位运算修行手册(二)
103 0
|
算法 Java 编译器
第 14 天_位运算【算法入门】
第 14 天_位运算【算法入门】
94 0
|
算法
《零基础学算法》(第一讲)位运算的奇技淫巧
《零基础学算法》(第一讲)位运算的奇技淫巧
147 0
|
存储 C语言 C++
【C++知识点】位运算
【C++知识点】位运算
141 0
|
算法 C语言 索引
基础算法-位运算
1. 位运算符简介 位运算符主要作用于位,是逐位进行操作。最常用的有:与 &、或 |、异或 ^。 常见的位运算符有(假设变量 A = 60,变量 B =13):