• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed C++ zadanie sekwencje bitowe

42 Warsaw Coding Academy
0 głosów
525 wizyt
pytanie zadane 10 kwietnia 2020 w C i C++ przez p4wix Obywatel (1,040 p.)
zamknięte 11 kwietnia 2020 przez p4wix
Cześć mam problem z zadaniem: Napisz funkcje która zlicza wystąpienie jednej sekwencji binarnej w drugiej (pomijając poprzedzające zera). Sekwencje podawane są jako liczby typu int. Sekwencje mogą się też nakładać. Liczby są wprowadzane w funkcji main. Program ma wyświetlać tylko liczbę wystąpień jednej sekwencji bitowej w drugiej. Np. dla int a = 5 (101 bez wiodących zer) oraz int b = 0xA8E9D2AC (czyli dziesiętnie -1461071188) na ekran należy wypisać 7, (nie korzystać z żadnych dodatkowych bibliotek).

Próbowałem samemu coś zrobić jednak że nie mam totalne pomysłu jak ugryźć to zadanie

Z góry dzięki za różne podpowiedzi.
komentarz zamknięcia: Otrzymałem odpowiedz na moje pytanie

2 odpowiedzi

+2 głosów
odpowiedź 11 kwietnia 2020 przez j23 Mędrzec (195,240 p.)
wybrane 11 kwietnia 2020 przez p4wix
 
Najlepsza
int main()
{
    int a = 5;
    int b = 0xA8E9D2AC;
    
    int bitSize = 0;
    int mask = 0;

    while (a > mask) {
        mask = (mask << 1) | 1;
        ++bitSize;
    }

    int n = 0;
  
    for (int i = bitSize - 1; i < 32; ++i) {
        if ((b & mask) == a) ++n;
        b >>= 1;
    }
  
    std::cout << n << '\n';
}

 

+1 głos
odpowiedź 11 kwietnia 2020 przez TOWaD Mądrala (6,420 p.)
edycja 11 kwietnia 2020 przez TOWaD

taki luźny pomysł bo jak ręcznie liczę to mi zły wynik wychodzi i algorytm nie efektywny

#include <iostream>
#include <vector>
#include <bitset>

using namespace std;
using unv=vector<unsigned>;
unv setonce (const unsigned & x ) {

    unv v;
    unsigned mask=(1<<(sizeof(unsigned)*8-1));
    while (mask) {

        if(x&mask) v.push_back(mask);
        mask>>=1;
    }

    return v;
}
unv setzero (const unsigned & x ) {

    unv v;
    unsigned mask=(1<<(sizeof(unsigned)*8-1));

    while (!(mask&x)) {
        mask>>=1;
    }

    while (mask) {

        if(x&mask);
        else v.push_back(mask);
        mask>>=1;
    }

    return v;
}

int main() {
    unsigned mask=(1<<31);

    unsigned x=0b101;
    unsigned liczba =0b101010101010111;

    unv onesmask=setonce(x);
    unv zerosmask=setzero(x);

    int licznik=0;
    cout<<bitset<sizeof(unsigned)*8>(x)<<endl;

    for(const auto & xv:onesmask) {
        cout<<bitset<sizeof(unsigned)*8>(xv)<<endl;
    }
    cout<<endl<<string(30,'/')<<endl;


    for(const auto & xv:zerosmask) {
        cout<<bitset<sizeof(unsigned)*8>(xv)<<endl;
    }
    cout<<endl<<string(30,'*')<<endl;



    unsigned first=*onesmask.begin();
    while (liczba>=first) {
        bool true1=1;
        for(auto xv:onesmask) {
            if(liczba&xv);
            else true1=0;

        }
        for(auto xv:zerosmask) {
            if(liczba&xv) {
                true1=0;

            }

        }

        cout<<true<<string(30,45)<<endl;
        if(true1) licznik++;
        liczba>>=1;

    }

    cout<<"\n\nlicznk="<<licznik<<endl;

    return 0;
}

 Jednak lepiej na sub stringu zrobić.

Podobne pytania

0 głosów
2 odpowiedzi 1,023 wizyt
pytanie zadane 2 maja 2018 w C i C++ przez four Użytkownik (720 p.)
0 głosów
1 odpowiedź 1,183 wizyt
pytanie zadane 4 kwietnia 2020 w C i C++ przez tomes235 Początkujący (320 p.)
0 głosów
2 odpowiedzi 612 wizyt
pytanie zadane 4 kwietnia 2020 w C i C++ przez p4wix Obywatel (1,040 p.)

93,382 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,741 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...