Negowanie do drugiego 0 albo 1

0

Cześć
Potrzebuje pomocy przy operacjach bitowych. Napisałem program który wyświetla reprezentacje binarna liczby całkowitej. Chciałbym aby program negował co drugie 0 na 1 albo co druga 1 na 0 nie mam pojęcia jak kto zrobić. Czy ktoś możne pomóc?

#include <iostream>

using namespace std;

int main()
{
    int tab[100];
    int a;
    int i = 0;
    int j;
    cin >> a;
    while (a > 0) {
        tab[i] = a % 2;
        i++;
        a = a / 2;
    }
    for (j = i - 1; j >= 0; j--) {
        cout << tab[j];
    }
    return 0;
}
0

Tak jest jak się gotowca weźmie...
Jak przechodzisz i wypisujesz sobie każdy znak to zamiast cout sprawdzaj czy jest 1 i jeśli tak to wstawiaj 0 a jeśli już jest 0 to wstawiaj 1 i tyle.

0

Okej rozumiem

for (j=i-1; j>=0; j--)
{
    if (tab[j]==1)
        cout << "0";
    if(tab[j]==0)
        cout << "1";
}

teraz bity są zanegowane. W jaki sposób mogę najprościej zanegowac co druga 1 albo 0. Dopiero uczę się c++

0

Sprawdzać czy aktualny indeks jest parzysty czy nie. Sprawdzisz to przez `j % 2 == 0'

0

Przepraszam nie do końca rozumiem gdzie umieścić ten warunek. Sam warunek rozumiem reszta z dzielenia przez 2 wynik 1 albo 0

0

No tam gdzie chcesz zmieniać co 2 znak. if warunek spełniony to wtedy sprawdzasz warunki dla znaku (czy 0 czy 1).

0

Chce zanegować co drugie 0. Dodałem zmienna "z" która na zmianę wykonuje warunek gdy tab[j]==0 i wyświetla 1 i 0 na zmianę jednak pętlą wykonuje się kilka razy za dużo. Możecie pomoc go zlokalizować?

#include <iostream>

using namespace std;

int main()
{
int tab[100];
int a;
int i=0;
int j;
int z=2;
cin >> a;
while (a>0)
{
    tab[i]=a%2;
    i++;
    a=a/2;
}
for (j=i-1; j>=0; j--)
{
    cout << tab[j];
}
cout << endl;
for (j=i-1; j>=0; j--)
{

    if (tab[j]==1)
        cout << "1";
    if((tab[j]==0) && (z%2==0))
        {
        cout << "0";
        z++;
        }
    if((tab[j]==0) && (z%2==1))
    {
        cout << "1";
        z++;
    }
}
return 0 ;
}
0

Tak miałeś zrobić:

for (j=i-1; j>=0; j--)
  {
    if(j % 2 == 0) {
      if (tab[j]==1)
        cout << "0";
      else 
        cout << "1";
    } else {
      cout << tab[j];
    }
  }
0

Dziękuję za pomoc. Jednak nie do końca o to mi chodziło ponieważ chce zanegować co drugie 0. Udało mi się to zrobić jednak pętla wykonuje się nadprogramowo i nie wiem gdzie jest błąd.

2
x = x ^ 0xAAAAAAAA; // A = 1010b
y = y ^ 0x55555555; // 5 = 0101b

https://wandbox.org/permlink/5Sc0ktnfDgZaKiNT

0

Przepraszam nie rozumiem co masz na myśli. Dopiero uczę się c++. Dlaczego ta pętla wykonuje się więcej razy?

for (j=i-1; j>=0; j--)
  {
    if (tab[j]==1)
        cout << "1";
    if (tab[j]==0)
    {
        if (z%2==0)
        {
            cout << "0";
            z++;
        }
        if (z%2==1)
        {
            cout << "1";
            z++;
        }
    }

  }
return 0 ;
}

dla a=128 po zamianie jest

1000 0000

po negacji

1010 1010 1010 101

Pętla wykonała się "nadprogramowo" gdzie jest błąd?

0

Nie rozumiem tego operatora bitowego ^ XOR czy możecie mi pomoc z tą pętla aby działała poprawnie?

0

Dlaczego nie wkleiłes tego co Ci napisałem tylko jakieś kombinacje ze zmienną z?

0

Pętla negowała wszystko ja chce zanegować tylko co 2 zero.

0

W dodatku wszystko zależny od j czy jest podzielny przez 2 czy nie. W sytuacji gdy jest ciąg 0000 zamiana jest dobra ale gdy jest 010 otrzymam 111

0

Bez gotowca sobie nie poradzisz, ale mam dzisiaj dobry humor bez powodu ;)

#include <iostream>
#include <bitset>

int main() {
	std::bitset<sizeof(int) * 8> bt(-5);
	std::bitset<sizeof(int) * 8> bt2(bt);
	for(size_t i=0; i<bt.size(); i++)
		if(i % 2 == 0)
			bt2.set(i, ~bt2[i]);
			
	std::cout << bt << "\n";
	std::cout << bt2;
	return 0;
}
0

Wow dziękuje :) jednak gotowiec mi nic nie daje tak jak napisałeś muszę to zrozumieć w jak najprostszej formie czy jest możliwość abyś powiedział gdzie jest błąd w tym kodzie a konkretnie w ostatniej pętli wykonuje się za dużo razy.

#include <iostream>
using namespace std;

int main()
{
int tab[100];
int a;
int i=0;
int j;
int z=2;
cin >> a;
while (a>0)
{
    tab[i]=a%2;
    i++;
    a=a/2;
}
for (j=i-1; j>=0; j--)
{
    cout << tab[j];
}
cout << endl;
for (j=i-1; j>=0; j--)
  {
    if (tab[j]==1)
        cout << "1";
    if (tab[j]==0 && (z%2==0))
    {
            cout << "0";
            z++;

    }
    if (tab[j]==0 && (z%2==1))
        {
            cout << "1";
            z++;

        }
    }

return 0 ;
}

zmienna z odpowiada ze to aby pętle wykonywały się na przemian i dla argumentu 0 raz wstawiało 0 a raz 1

Edytowałem kod jeżeli masz chwile i chęci to proszę o pomoc. Program ma zamieniać liczbę na reprezentacje binarna oraz negować co drugie zero. W możliwie najprostszy spodów gdyż dopiero uczę się pogracować.

1

Program ma zamieniać liczbę na reprezentacje binarna oraz negować co drugie zero. W możliwie najprostszy spodów gdyż dopiero uczę się pogracować

Wiem dokładnie co ma robić, przecież zaimplementowałem dokładnie to co opisałeś i na oko potrzebowałem do tego o 2/3 kodu mniej niż Ty. Prościej nie umiem.

powiedział gdzie jest błąd w tym kodzie a konkretnie w ostatniej pętli wykonuje się za dużo razy

Z tą pętlą kilka rzeczy jest nie tak, ale akurat wykonuje się tyle razy ile powinna, po prostu kilka warunków jest spełnionych i wołasz kilka razy cout w jednej iteracji. Zamień drugi i trzeci if na else if i będziesz mial wyświetloną poprawną ilość bitów. Ale to nie sprawi, że kod będzie działać ;) Do reszty już powinieneś dojść sam.

0

Dziękuję wszystkim za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1