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

Zamiana dowolnego bitu wedle uznania

Object Storage Arubacloud
0 głosów
290 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez Atman Użytkownik (810 p.)

Moje zadanie to pokazać n-bit i wskazać czy liczba jest parzysta czy nie. To mi się udało. Natomiast ostatnia część zadania to zamiana n-tego bitu z 1 na 0 lub jeśli jest 0 zamiana na 1. Nie wiem gdzie jest błąd. W teorii następuje zamiana ale ostatni cout znowu pokazuje że jest inaczej. Proszę o pomoc.

#include <iostream>

using namespace std;

int main()
{
	int liczba;
	int bit;
	int n;
	int i=1;
	int j=1;
	int znowu;

	cout<<"Podaj liczbe: ";
	cin>>liczba;

	cout<<"Bit liczby ktory chcesz zobaczyc: ";
	cin>>n;

	bit = (liczba & n);

	cout<<n<<" bit liczby wynosi: "<<bit<<endl;


	if ((liczba & 1) != 0)
		cout<<"Liszba "<<liczba<<" jest nieparzysta"<<endl;
	else
		cout<<"Liszba "<<liczba<<" jest parzysta"<<endl;


	if ((liczba & 1) == 0)
	{
	   while (i<=1)
	  {
		(liczba & n) == 1;
		cout<<n<<" bit liczby po zmianie wynosi 1 "<<endl;
		i++;
	  }
	}

	else
	{
	   while (j<=1)
	  {
		(liczba & n) == 0;
		cout<<n<<" bit liczby po zmianie wynosi 0 "<<endl;
		j++;
	  }
	}
	
	znowu = (liczba & n);
	cout<<"Nowy bit o numerze "<<n<<" wynosi "<<znowu<<endl;


	
	system("PAUSE");
	return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 1 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

Żeby zobaczyć czy dany bit jest ustawiony musisz utworzyć maskę bitową w której ustawiony jest tylko wybrany bit i zrobić sumę bitową liczby z tą maską.

Przykład: liczba = 255, chcesz zobaczyć bit 3 (numerowanie od zera)

liczba - 11111111
maska  - 00001000
&      - 00001000 <-- różne od 0, bit ustawiony

Aby uzyskać maskę możesz użyć operatora przesunięcia bitowego

int maska = 1 <<  numer_bitu;

Aby odwrócić bit użyj takiej samej maski i operatora XOR

liczba - 11111111
maska  - 00001000
^      - 11110111
komentarz 1 kwietnia 2020 przez Atman Użytkownik (810 p.)
A mógłbyś mi to wpisać w kod? Bo ja tego nie potrafię za bardzo
komentarz 1 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

Użyję twoich zmiennych liczba i n
 

int maska = 1 << n;
int suma_bitowa = liczba & maska;
int bit = (suma_bitowa == 0) ? 1 : 0; // dla 1 i 0 czytelności 
                                                          // (zamiast automatycznego rzutowania z bool)
int odwrocony_bit = (suma_bitowa == 0) ? 0 : 1;

cout << "Bit numer " << n << " ma wartość << bit << ". Po odwróceniu " << odwrocony_bit << endl;

int liczba2 = liczba ^ maska;
cout << "Po odwroceniu wartosci bitu " << n << " liczba " << liczba << " zmienia sie w " << liczba2 << endl;

 

0 głosów
odpowiedź 1 kwietnia 2020 przez DragonCoder Nałogowiec (36,500 p.)

Ta zamiana bitu nie dziala chyba dla wszytskich przypadkow:

2 bit liczby wynosi: 0
Liszba 9 jest nieparzysta
2 bit liczby po zmianie wynosi 0 
Nowy bit o numerze 2 wynosi 0

dla liczby 15

Bit liczby ktory chcesz zobaczyc: 2
2 bit liczby wynosi: 2
Liszba 15 jest nieparzysta
2 bit liczby po zmianie wynosi 0 
Nowy bit o numerze 2 wynosi 2

Cos chyba jednak nie to chodzi. Ogolnie zamienilbym liczbe na stary dobry sposob, zmiana liczby na binarna i wtedy bawilbym

std::cout << "Podaj liczbe do konwersji: ";
    int liczba;
        std::cin >> liczba;
    std::vector <short> binarka;
    while (liczba > 0) {
        binarka.push_back(liczba%2);
        liczba /= 2;
    }
    for (int i = 0; i < binarka.size(); i++) {
        std::cout << binarka[i];
    } //dodaj zmiane pozycji

    std::cout << "ktory bit chcesz zmienic: ";
    int miejsce;
        std::cin >> miejsce;
    std::cout << !binarka[miejsce-1];

cos w tym sytlu

Podobne pytania

0 głosów
1 odpowiedź 4,268 wizyt
pytanie zadane 27 stycznia 2019 w Python przez Q7V Gaduła (4,250 p.)
0 głosów
1 odpowiedź 141 wizyt
pytanie zadane 16 czerwca 2016 w C i C++ przez Arkadiusz Sieczak Początkujący (400 p.)
0 głosów
2 odpowiedzi 117 wizyt

92,572 zapytań

141,422 odpowiedzi

319,645 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...