zoukankan      html  css  js  c++  java
  • 位运算

    常见位运算操作:x>>j&1,判断x二进制下从右往左第j个数是不是1.

                                如果要枚举32个状态,可以把1<<32,每一位代表一个状态

                                以两道递归题为例。

    题目1:给你1~n个数,从中选取任意多的数,然后输出所有可能的结果

    思路分析:每一个数都面临选与不选两种可能性,所以可以用一个二进制下为n位的数来保存每一个结果,如果第k位是0,则表示数k不选,如果第k位为1,则表示数k被选中。

                      这里保存两种状态,当前要枚举的数是第几个数,还有哪些数已经被枚举过了,这个用一个n位的二进制数实现。并且如果当前数被选进去 ,则将其对应的二进制位置1,state+(1<<cur);

                      如果没有被选进去,则保存的数组仍然是state。下面上代码

    #include<iostream>
    
    using namespace std;
    
    int n;
    
    void dfs(int cur,int state)
    {
        if(cur==n)
        {
            for(int i=0;i<n;i++)
            {
                if(state>>i&1)
                cout<<i+1<<" ";
            }
            cout<<"
    ";
        }
        else
        {
            dfs(cur+1,state);
            dfs(cur+1,state+(1<<cur));
        }
    }
    
    int main()
    {
           cin>>n;
           dfs(0,0);       
           return 0;                                  
     } 

  • 相关阅读:
    apache 配置文件修改
    linux下开机启动设置
    linux 图形与字符切换
    帝国cms phpmyadmin数据库操作及密码修改
    linux 任务计划
    linux服务进程管理
    linux文件夹权限
    linux yum安装apache
    常用的sql server规范
    SQL索引一步到位
  • 原文地址:https://www.cnblogs.com/rainyskywx/p/10293534.html
Copyright © 2011-2022 走看看