비트 조작

4081 단어 cppbeginners

일일 학습



오늘은 비트 조작에서 몇 가지 트릭을 배웠고 같은 것을 공유하고 싶습니다.

중요한 공식


  • x의 왼쪽 시프트를 y비트로 수행하려면x<<y
  • x를 y비트만큼 오른쪽으로 시프트하려면x>>y
  • xor는 다른 모든 요소가 두 번 나타날 때 반복되지 않는 요소를 찾으려는 경우에 유용합니다. 모든 요소를 ​​xor하여 고유한 요소를 찾을 수 있습니다.
  • 숫자가 2의 거듭제곱인지 확인하려면 number&(number-1)를 수행하면 0이면 2의 거듭제곱이 아닌 2의 거듭제곱이 됩니다.
  • i번째 최하위 비트가 설정되었는지 여부를 찾으려면(n&(1<Power of 2 : 2,4,8,16,...

  • 비트 조작은 이를 사용하여 공간 복잡성을 줄일 수 있기 때문에 공간 제약이 있을 때 매우 유용합니다.

    -------------------------------------------------- ----------



    회문인 문자열의 하위 시퀀스를 생성하려면
    첫 번째 작업은 하위 시퀀스를 생성하는 것입니다(일부 문자를 제거한 후 문자열의 일부입니다). 다음은 회문인지 여부를 확인하는 것입니다.
  • Step1 : 문자열의 길이를 구한다. 이제 우리는 2개의 거듭제곱 길이 수의 부분 시퀀스를 생성하고 회문을 형성하는지 여부를 확인해야 합니다.
  • 2단계: 따라서 0에서 2승 n까지의 모든 숫자를 생성합니다
  • .
  • 3단계: 이제 하위 시퀀스를 생성해야 합니다. 그렇게 하기 위해 숫자를 하위 시퀀스의 표현으로 가정해야 하는 경우 0은 문자열의 문자가 하위 시퀀스의 일부가 아님을 나타냅니다. 1은 문자열의 문자가 하위 시퀀스의 일부임을 알려줍니다. 그래서 0과 1은 무엇입니까
  • 4단계: 그들은 우리가 취한 문자열의 이진 표현이므로 먼저 각 숫자를 이진수로 변환해야 합니다. 그런 다음 1이 있는 임시 문자열에 해당 문자를 추가할 수 있으며 회문인지 확인할 수 있습니다. 아니다.

  • Generate palindromic Subsequences from a given string



    질문에 대한 코드




    #include<bits/stdc++.h>
    using namespace std;
    bool ispalindrome(string s)
    {
        int i=0;
        int j=s.length()-1;
        while(i<j)
        {
            if(s[i]==s[j])
            {
                i++;
                j--;
            }
            else
            return false;
        }
        return true;
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            string s;
            cin>>s;
            int count=0;
            int n=s.length();
            for(int i=0;i< (1<<n);i++) //it will generate pow(2,n) subsequences
            {
                string temp="";
                for(int j=0;j<n;j++)
                {
                    int x=(1<<j);
                    if((x&i)!=0)
                    {
                    //  cout<<s[j];
                        temp+=s[j];
                    }
                }
                //cout<<endl;
                if(temp!="")
                {
                    //cout<<temp<<endl;
                    if(ispalindrome(temp))
                    count++;
                }
            }
            cout<<(count+1)<<endl;
        }
    }
    


  • 질문 출처: Hackerearth

  • Link

    Another application of Bit Manipulation is when you are given few numbers and you need to check sum of the difference in bits between any two numbers.


    For Example: 3 2 4 011 010 100 answer is 12

    질문에 대한 코드




    #include <iostream>
    #include <vector>
    # include <cstring>
    using namespace std;
    
    int main() {
        // your code goes here
        int t;
        cin>>t;
        for(int k=1;k<=t;k++)
        {
    
            int n;
            cin>>n;
            vector<int> arr(n);
            for(int i=0;i<n;i++)
            cin>>arr[i];
            int bitset[32];
            memset(bitset,0,sizeof(bitset));
            for(int i=0;i<32;i++)
            {
                for(int j=0;j<n;j++)
                {
                    int x=(1<<i);
                    if(arr[j]&x)
                    bitset[i]++;
                }
            }
            long long int res=0;
            for(int i=0;i<32;i++)
            {
                res+=bitset[i]*(n-bitset[i]);
                if(res>10000007)
                res=res%10000007;
            }
            res=2*res;
            if(res>10000007)
            res=res%10000007;
            cout<<"Case "<<k<<": ";
            cout<<res<<endl;
        }
        return 0;
    }
    


    질문 출처:SPOJ

    link

    원천 :

    좋은 웹페이지 즐겨찾기