zoukankan      html  css  js  c++  java
  • 17.二进制中1的个数

     位运算:

    第一个操作。

    n的二进制表示中第k位数字是几

    这里的第k位指的是,从右往左第0位,第1位,第2位

    1:先把第k位数字移到最后一位 n>>k

    2:看个位是几 x&1

    结合起来就是n>>k&1

     第二个操作:

    lowbit操作

    lowbit(x)的作用是返回x的最后一位1

    比如x=1010,那么lowbit(x) = 10,等于2

    x=101000,lowbit(x) = 1000

    lowbit返回的是一个二进制数,这个二进制数的头一位1是原数的最后一位1

    lowbit是怎么实现的

    x & -x = x & (~x + 1)

    计算机数字运算均是基于补码的。

    -x = ~x + 1这句话是针对补码而言的

    负x等于取反x加1

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int main() {
     4     int n = 10;
     5     unsigned int x = -n;
     6     for (int i = 31; i >= 0; i--) {
     7         cout << (x >> i & 1);
     8     }
     9     return 0;
    10 }

     应用:统计x里面1的个数

    思想就是每次把最后一位1去掉

    当x等于0的时候,就没有1了

    减了多少次,就有几个1

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int lowbit(int x) {
     4     return x & -x;
     5 }
     6 int main() {
     7     int n;
     8     cin >> n;
     9     while (n--) {
    10         int x;
    11         cin >> x;
    12         int res = 0;
    13         while (x) {
    14             x -= lowbit(x);
    15             res++;
    16         }
    17         cout << res << " ";
    18     }    
    19     return 0;
    20 }
  • 相关阅读:
    Codeforces Round #104 (Div. 1) C. Lucky Subsequence
    UVALive 4848 Tour Belt
    ...
    HDU4609 计数问题+FFT
    hdu6129 Just Do It!
    hdu6133 Army Formations 线段树合并
    迭代FFT
    第二类Stirling数
    project euler113
    HBase 常用shell命令
  • 原文地址:https://www.cnblogs.com/fx1998/p/12826831.html
Copyright © 2011-2022 走看看