zoukankan      html  css  js  c++  java
  • lowbit运算加Hash找出整数二进制表示下所有是1的位

    预备知识https://www.cnblogs.com/fx1998/p/12826831.html

    当输入的数n较小时,直接开一个数组H

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 1 << 20;
     4 //2 ^ 20 = 1048576
     5 int H[N + 10];
     6 int main() {
     7     for (int i = 0; i <= 20; i++) { //预处理
     8         H[1 << i] = i;
     9     }
    10     int n;
    11     while (cin >> n) {
    12         while (n > 0) {
    13             cout << H[n & -n] << " ";
    14             n -= n & -n;
    15         }
    16         cout << endl;
    17     }
    18     return 0;
    19 }

    运行结果及解释:

     然后根据二进制码8421

    9的二进制表示为  1001

    7的二进制表示为  0111

    4的二进制表示为  0100

    然后从右往左从0开始数的话:

    9的第0位,第3位是1,所以输出0 3

    7的第0位,第1位是1,第2位是1,所以输出0 1 2

    4的第2位是1,所以输出2

    然后是稍微复杂但效率更高的方法

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 //2 ^ 35 = 34,359,738,368。要开long long
     4 int H[37];
     5 int main() {
     6     for (int i = 0; i < 36; i++) { //预处理
     7         H[(1ll << i) % 37] = i;
     8     }
     9     int n;
    10     while (cin >> n) {
    11         while (n > 0) {
    12             cout << H[(n & -n) % 37] << " ";
    13             n -= n & -n;
    14         }
    15         cout << endl;
    16     }
    17     return 0;
    18 }

    lowbit运算是树状数组的一个基本操作,在之后会学到

  • 相关阅读:
    2020.4.21 考试T1 HDU 5729
    BZOJ 4198: [Noi2015]荷马史诗
    BZOJ 1052: [HAOI2007]覆盖问题
    BZOJ 1087: [SCOI2005]互不侵犯King
    BZOJ 4466 线性函数
    Linux如何挂载U盘
    集中式日志分析平台
    ELK5.2+kafka+zookeeper+filebeat集群部署
    浅析ES的_source、_all、store、index
    IndexOf、LastIndexOf、Substring的用法
  • 原文地址:https://www.cnblogs.com/fx1998/p/13891310.html
Copyright © 2011-2022 走看看