简单位运算

文章目录

  • n n n 的第 k k k 位是二进制的几
  • lowbit(n)操作求解 n n n 的最后一个 1 1 1
    • 题目练习
      • AcWing 801. 二进制中1的个数
      • CODE1
  • 原码、补码、反码



  • n n n 的第 k k k 位是二进制的几

    • 我们需要用到&运算符:两位都为 1 1 1 时结果才为 1 1 1 ,否则为 0 0 0
    • 公式: n > > k & 1 n >> k \& 1 n>>k&1

  • lowbit(n)操作求解 n n n 的最后一个 1 1 1

    简单位运算_第1张图片

    • 由此我们可以得到公式: l o w b i t ( x ) = x & ( − x ) lowbit(x) = x \& (-x) lowbit(x)=x&(x) 最终得到一个 1 1 1 后面跟着一串 0 0 0
    • 评论区dalao的方案简单位运算_第2张图片
      简单位运算_第3张图片

    题目练习

    AcWing 801. 二进制中1的个数

    题目链接:https://www.acwing.com/problem/content/description/803/
    简单位运算_第4张图片

    • 直接用我们刚刚的结论即可

    CODE1

    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    
    int n;
    
    int lowbit(int n){
        return n & (-n);
    }
    
    int main()
    {
        cin >> n;
        
        while(n--){
            int x, ans = 0;
            cin >> x;
            
            while(x) ans++, x -= lowbit(x);		//只要x不为0,那就肯定含1
            
            cout << ans << ' ';
        }
    }
    

    ###CODE2

    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    
    int n;
    
    int main()
    {
        cin >> n;
        
        while(n--){
            int x, ans = 0;
            cin >> x;
            
            while(x) ans++, x &= x - 1;
            
            cout << ans << ' ';
        }
    }
    

  • 原码、补码、反码

    简单位运算_第5张图片
    • i n t   x = 10 int\ x = 10 int x=10,二进制表示为 00...01010 00...01010 00...01010
    • 对于-x我们该怎么表示呢?
      • 众所周知,计算机底层是没有减法的,所以只能靠加法来表示减法,那么就是式子: x + ( − x ) = 0 x + (-x) = 0 x+(x)=0
      • 最终运算得到 − x = 0 − x -x = 0 - x x=0x
      • 0 − x =   ˜ x ( x 取反) + 1 = − x 0 - x = \~\ x(x取反) + 1 = -x 0x= ˜xx取反)+1=x

你可能感兴趣的:(算法学习记录,算法,笔记,c++)