zoukankan      html  css  js  c++  java
  • 二进制枚举

    二进制枚举有啥用?

    代码短,比起dfs枚举还要快

    怎么枚举的?

    比如你有三个物品,你只需要从0枚举到2^3-1=7就可以了(dfs枚举我就不说了)

    为什么呢?

    0——7这几个数的二进制形式如下

    0——000

    1——001

    2——010

    3——011

    4——100

    5——101

    6——110

    7——111

    你可以把1当作选这个物品,0代表不选这个物品。每一个位置上对应一个物品的选择

    什么意思呢?

    就比如2——010

    我们就可以定义从左到右第一个位置对应1号物品的选与不选,从左到右第二个位置对应2号物品的选与不选,从左到右第三个位置对应3号物品的选与不选

    那么2——010代表的意义就是第一个物品不选,第二个物品要选,第三个物品不选

    而且从0——7的每一个数都具有这样的意义。那么可以说从0——(2^n)-1(n代表n个物品)这样枚举,这号可以把所有状态枚举到

    一些位运算符

    按位与运算符(&)

    参加运算的两个数据,按二进制位进行“与”运算。
    运算规则:0&0=0;  0&1=0;   1&0=0;    1&1=1;
          即:两位同时为“1”,结果才为“1”,否则为0
    例如:3&5  即 0000 0011& 0000 0101 = 00000001  因此,3&5的值得1。

    左移运算(<<)

     a << b就表示把a转为二进制后左移b位(在后面添b个0)。例如100的二进制为1100100,而110010000转成十进制是400,那么100 << 2 = 400。可以看出,a << b的值实际上就是a乘以2的b次方,因为在二进制数后添一个0就相当于该数乘以2(这样做要求保证高位的1不被移出)。
    通常认为a << 1比a * 2更快,因为前者是更底层一些的操作。因此程序中乘以2的操作请尽量用左移一位来代替。
     
    除了左移还有右移,右移代表除2(只保留整数部分)
    a<<b   代表:a的二进制形式向左移动了b个位置,相当于乘了b个2
    a>>b   代表:a的二进制形式向右移动了b个位置,相当于除了b个2
     

    代码:

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int main()
     6 
     7 {
     8 
     9     int n;
    10 
    11     cin >> n;
    12 
    13     for(int i = 0; i < (1<<n); i++) //从0~2^n-1个状态
    14 
    15     {
    16 
    17         for(int j = 0; j < n; j++) //遍历二进制的每一位
    18 
    19         {
    20 
    21             if(i & (1 << j))//判断二进制第j位是否存在
    22 
    23             {
    24 
    25                 printf("%d ",j);//如果存在输出第j个元素
    26 
    27             }
    28 
    29         }
    30 
    31         printf("
    ");
    32 
    33     }
    34 
    35     return 0;
    36 
    37 }
  • 相关阅读:
    String字符串性能优化的探究
    Spring笔记(5)
    Spring笔记(4)
    力扣217. 存在重复元素
    力扣1480. 一维数组的动态和
    Ribbon 和 Feign 的区别
    Eureka的自我保护机制
    Planar graph and map 3-colorability reduce to one another
    3-colorability
    一少年独坐屋中突然顿悟!-回溯
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/12110851.html
Copyright © 2011-2022 走看看