zoukankan      html  css  js  c++  java
  • 位运算 进制转化 STL中bitset用法

     2017-08-17 16:27:29

    writer:pprp

    /*
    题目名称:输入十进制以二进制显示
    程序说明:同上
    作者:pprp
    备注:无
    日期:2017/8/17
    */
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int number, s[32];
    
        cin >> number;
    
        for(int i = 1; i <= 32 ; i++)
            s[i-1] = number >> (i - 1) & 1;
            
        for(int i = 31 ; i >= 0 ; i--)
            cout << s[i] <<"";
            cout << endl;
            
        return 0;
    }

    以上的这个算法把我坑坏了虽然是正确的,但是建议用下边的个来转化为二进制

    正确代码如下:

    //转化为二进制
    //test:ok
    void tenTwo(int tmp)
    {
        memset(bt,0,sizeof(bt));
        int i = 0;
        while(tmp)
        {
            bt[i++] = tmp%2;
            tmp /= 2;
        }
    }

     二进制转为十进制

    //转化为十进制
    //test:ok
    ll twoTen(int a[])
    {
        ll ans = 0;
        for(int i = 0 ; i < N ; i++)
        {
            ans += (1 << i ) * a[i];
        }
        return ans;
    }

     

    按位与运算& 用来判断一个数某一位

    按位或运算 | 用来改变一个数

    异或^ (a xor b)xor b = a;这个可以用来解密

    /*
    name:解密
    declare:同上
    writer:pprp
    more:无
    date:2017/8/17
    */
    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    int main()
    {
        int a = 981007;
        int b;
        
        while(cin >> b)
        {
              int c = a ^ b;
              cout << c << endl;
              c =  c ^ b ;
              cout << c << endl;
        }
        return 0;
    }

    异或用法的一道例题:

    /*
    name:输入二进制以十进制显示
    declare:同上
    writer:pprp
    more:无
    date:2017/8/17
    */
    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    int main()
    {
        int a = 981007;
        int b;
        
        while(cin >> b)
        {
              int c = a ^ b;
              cout << c << endl;
              c =  c ^ b ;
              cout << c << endl;
        }
        return 0;
    }

     

    /*
    name:找丢失的数字
    declare:有一组连续的数据,从1到n排列,
    中间丢失了一个数字,顺序也被打乱,
    放在一个n-1的数组中,请找到丢失的数字;
    writer:pprp
    more:异或的用法 a ^ a = 0
    date:2017/8/17
    */
    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    int Find(int * a, int Size)
    {
        int num = 0;
        for(int i = 0 ; i < Size; i++)
        {
            num = num ^ (i + 1) ^ a[i];
        }
        num ^= (Size + 1);
        return num;
    }
    
    int main()
    {
        int a[] = {1,2,4,5,6,7,8,9,10,11};
        cout << Find(a, 10) << endl;
        return 0;
    }

     

    常用的二进制位变换操作

    最后一位取反 x ^ 1
    
    把右数第k为取反 x ^ (1 << (k - 1))
    
    把右数第k为变成1  x | (1 << (k - 1))
    
    把右数第k为变成0   x & ~(1 << (k - 1))        
    
    把末k为取反    x ^ ((1 << k) - 1)
    
    把末k位变成1   x | ((1 << k) - 1)
    
    
    在状态压缩中的应用:
    
    A = 1011 表示  A = {0, 2, 3}
    
    常见操作:
    并集操作         A | B
    交集操作         A & B
    集合的差         A| ~B
    补集             -1~A
    加入第i个元素    A = A | (1 << i)
    删除第i个元素    A = A | ~(1 << i)
    判断第i个元素    A | (1 << i) <> 0

    bitset用法讲解:

    /*
      name:bitset模板
      writer:pprp
      declare:bitset各种用法详解
      date:2017/8/17
    */
    
    #include <iostream>
    #include <bitset>
    #include <string>
    
    using namespace std;
    
    string temp = "1010111101";
    bitset<10> bit(temp);
    
    void out()
    {
          for(int i = 0 ; i < 10; i++)
          {
                cout << bit[i];
          }
          cout << endl;
    }
    int main()
    {
        //构造函数1
        bitset<500000> bin1;
        bin1[0] = 1;
        bin1[1] = true;
        bin1[2] = 0;
        bin1[3] = false;
        cout << bin1[0] << bin1[1] << bin1[2] << bin1[3] << endl;
    
        //构造函数2
        bitset <5> bin2(5);
        for(int i = 0 ; i < 5 ; i++)
            cout << bin2[i];
        cout << endl;
        //构造函数3
        string tmp = "1010111100";
        bitset<10>bin3(tmp);
        for(int i = 0 ; i < 10; i++)    //从左向右依次填入
            cout << bin3[i];
    
        //构造函数4
        string tmp1 = "1010111101";
        bitset<10>bin4(tmp1,4);//从第四位开始取值
        for(int i =0 ; i < 10; i++) //还是从左向右依次填入
            cout << bin4[i];
    
        //构造函数5
        string tmp2 = "1010111101";
        bitset<10>bin5(tmp2,4,5);//从第四位开始取值取5位
        for(int i =0 ; i < 10; i++) //还是从左向右依次填入
            cout << bin5[i];
        cout << endl;
        
        //其他函数
        cout <<"test"<<endl;
        
        out();
        
        cout << bit.any() << endl;//是否存在1的位
        
        cout << bit.none() << endl;//是否都为0
        
        cout << bit.count() << endl;//进制为1的个数
        
        cout << bit.size() << endl;//进制的长度
        
        bit.flip(); //按位取反
        out();
        
        bit.flip(0); //第0位取反
        out();
        
        for(int i = 0 ; i < 10 ; i++)
        cout << bit.operator[](i) ;  //取第i位的值
        cout << endl;
        
        bit.set();
        out();
        
        bit.reset();
        out();
        
        bit.set(0);
        out();
        
        bit.reset(0);
        out();
        
        cout << bit.test(0) << endl;//第0号是否为1
        
        bit.set();
        
        int x = bit.to_ulong();//转为整数
        cout << x << endl;
        
        return 0;
    }

     

  • 相关阅读:
    js选项卡
    js 逻辑运算符
    git 标签管理
    git多人协作
    git 分支强制删除
    git bug修复
    DOS命令编译JAVA程序
    JDK的安装与配置
    我在linux的第一个C程序
    看我如何在控制台一行显示几万字符。
  • 原文地址:https://www.cnblogs.com/pprp/p/7382470.html
Copyright © 2011-2022 走看看