|C++| Zamiana liczby binarnej na dziesiętną

0

Cześć, siema!
Mam problem. Otóż mam zadanie domowe do szkoły, w którym muszę napisać program symulujący kontrolę parzystości bitów w pamięci komputera. Dodatkowo muszę dodać moduł wskazujący na uszkodzony bit. I tu jest problem: otóż muszę zamienić liczbę binarną na dziesiętną. Nie jest to jednak takie proste jakby się wydawało, ponieważ bity, które mają być przeliczane na postać dziesiętną są wartością funkcji.
Oto kod:

// Program symulujący kontrolę parzystości bitów
#include <iostream>
#include <math.h>
#include <iso646.h>
#include <conio.h>
using namespace std;
//Inicjalizacja funkcji
int XOR(int pozycja,int D7, int D6,int D5,int D4,int D3,int D2,int D1,int D0) //Funkcja 'XORująca' bity i wyświetlająca bity parzystości
{
	int wynik;
	switch(pozycja)
	{
		case 1:
		wynik = D7 xor D6 xor D4 xor D3 xor D1;
        cout << wynik;
		break;
		case 2:
		wynik = D7 xor D5 xor D4 xor D2 xor D1;
        cout << wynik;
		break;
		case 4:
		wynik = D6 xor D5 xor D4 xor D0;
        cout << wynik;
		break;
		case 8:
		wynik = D3 xor D2 xor D1 xor D0;
        cout << wynik;
		break;
	}
	return 0;
}
void PracaZProgramem() //Funkcja rozpoczynająca pracę z programem
{
	int itD[8];
	cout << "----------------------------------------------------------------------------" << endl;
	cout << endl;
	cout << "\t\t\t\tECC Simulator" << endl;
	cout << "\n\n\n\n" << endl;
	cout << "  Napisz 8-bitowe slowo za kazdym bitem wciskajac enter lub oddzielajac je\n  spacjami:\n" << endl;
	cin >> itD[7] >> itD[6] >> itD[5] >> itD[4] >> itD[3] >> itD[2] >> itD[1] >> itD[0];
	cout << endl;
	cout << "----------------------------------------------------------------------------" << endl;
	cout << endl;
	// Wyświetlenie ciągu wpisanych bitów
	cout << "Twoj ciag bitow to: " << itD[7] << itD[6] << itD[5] << itD[4] << itD[3] << itD[2] << itD[1] << itD[0] << endl;
	cout << endl;
	// Zdefiniowanie krótszej nazwy bitu parzystości
	#define P0 XOR(1,itD[7],itD[6],itD[5],itD[4],itD[3],itD[2],itD[1],itD[0]);
	#define P1 XOR(2,itD[7],itD[6],itD[5],itD[4],itD[3],itD[2],itD[1],itD[0]);
	#define P2 XOR(4,itD[7],itD[6],itD[5],itD[4],itD[3],itD[2],itD[1],itD[0]);
	#define P3 XOR(8,itD[7],itD[6],itD[5],itD[4],itD[3],itD[2],itD[1],itD[0]);
	// Wyświetlenie bitów parzystości
	cout << "Bity parzystosci:" << endl;
	cout << endl;
	cout << "P0= ";
	P0;
	cout << endl;
	cout << "P1= ";
	P1;
	cout << endl;
	cout << "P2= " ;
	P2;
	cout << endl;
	cout << "P3= ";
	P3;
	cout << endl;
	// Wyświetlenie kodu Hamminga
	cout << "\n\nKod Hamminga: ";
	P0;
	P1;
	cout << itD[7];
	P2;
	cout << itD[6] << itD[5] << itD[4];
	P3;
	cout << itD[3] << itD[2] << itD[1] << itD[0] << endl;
	int itP[4];
	itP[3] = P3;
	itP[2] = P2;
	itP[1] = P1;
	itP[0] = P0;
	cout << "\nUszkodzony bit znajduje sie na pozycji ";
	cout << endl;
}
void OProgramie()
{
	cout << "----------------------------------------------------------------------------" << endl;
	cout <<  endl;
	cout << "\t\t\t\tECC Simulator" << endl;
	cout << endl;
	cout << "  ECC Simulator to symulator kontroli parzystosci bitow w pamieci komputera.\n  Aby zaczac prace z programem nalezy wpisac liczbe '1'. ";
	cout << "Nastepnie trzeba podac\n  ciag bitow oddzielajac je spacjami i nacisnac klawisz 'Enter'. ";
	cout << "Program\n  zasymuluje dzialanie kontroli parzystosci i dopisze '1' lub '0' w zaleznosci";
	cout << "    od tego czy wpisalismy parzysta liczbe jedynek czy nie oraz 'powie', ktory\n  bit jest uszkodzony.\n\n";
	cout << "  Zycze milej pracy :)" << endl;
}
//Funkcja główna
int main()
{
	int iwybor;

	//Interfejs "graficzny"
	cout << endl;
	cout << "\t\t\t\tECC Simulator" << endl;
	cout << "\t\t\t--------------------------" << endl;
	cout << endl;
	cout << "\tECC Simulator to program majacy za zadanie zasymulowac korekcje\n\t\t\tbledow podanego ciagu bitow." << endl;
	cout << "\tWiecej o programie oraz instrukcja obslugi po wpisaniu liczby '2'" << endl;
	cout <<  endl;
	cout << "  +------------------------------+" << endl;
	cout << "  |\t      Menu               |" << endl;
	cout << "  +------------------------------+" << endl;
	cout << "  | [1] Zacznij prace z programem|" << endl;
	cout << "  | [2] O programie              |" << endl;
	cout << "  | [3] Koniec pracy z programem |" << endl;
	cout << "  +------------------------------+" << endl;
	cout << endl;

	//Główny kod programu
	cout << "  Co chcesz robic?: ";
	cin >> iwybor;
	switch(iwybor)
	{
	case 1:
		PracaZProgramem();
		break;
	case 2:
		OProgramie();
		break;
	case 3:
		return 0;
		break;
    default:
    while(iwybor < 1 || iwybor > 3)
    {
        cout << "  Podales zla liczbe. Podaj liczbe z menu: ";
        cin >> iwybor;
        switch(iwybor)
        {
        case 1:
            PracaZProgramem();
            break;
        case 2:
            OProgramie();
            break;
        case 3:
            return 0;
            break;
        }
    }
	}
	_getch();
}

Już wyjaśniam długość kodu. Jednym z wymogów tego zadania było stworzenie programu dla obcej osoby, a nie dla mnie. Program musi więc być zrozumiały i przejrzysty dla obcej osoby. Taka osoba ma wiedzieć jak się posłużyć tym programem.
A mi konkretnie chodzi o zamianę liczby binarnej stworzonej z elementów

 P3, P2, P1, P0 

w takiej właśnie kolejności.
Nie wiem czy wiecie o co mi chodzi :D. Jak coś to się pytajcie o konkrety. A i nie zrozumcie mnie źle. Ja nie proszę o gotowy kod tylko o konkretną podpowiedź.

0
  1. P3, P2, P1, P0 to są wywołania funkcji która zwraca zawsze 0, jedynie wyświetla ten wynik na ekran
  2. Jeżeli to będą bity to: cout<<((P3<<3)|(P2<<2)|(P1<<1)|(P0))<<endl;
0

ja bym ustawiał bezpośrednio w zmiennej wszysatkie bity wtedy ze zamianą nie było by kłopotów:

#include <iostream>

int main() {         
unsigned char byte = (char)0; //8 bitów  
unsigned char mask = 128;

for(int i = 8; i >=1 ;i--)     
{        
    unsigned int bit;       
    std::cin >> bit;      
    
    if(bit != 0)            
        byte |= mask;   
    mask >>= 1;
}      
    std::cout << (unsigned int)byte;    
} 

//edit
MOŻE TAK JEST LEPIEJ WIELKI WSZECHWIEDZĄCY @_13th_Dragon

0

A dlaczego taka funkcja nie działa prawidłowo?:

void BINtoDEC (int p3, int p2, int p1, int p0)
{
    cout << p3 * pow(2,3) + p2 * pow(2,2) + p1 * pow(2,1) + p0 * pow(2,0);
}

Gdy za parametry podstawiam

P3, P2, P1, P0 

to cały czas pokazuje mi zero, a jak podstawie zwykłe zmienne, którym nadam wartości 0 lub 1 to liczy prawidłowo. Wie ktoś dlaczego?

0
Aksjomat napisał(a):

A dlaczego taka funkcja nie działa prawidłowo?:

void BINtoDEC (int p3, int p2, int p1, int p0)
{
    cout << p3 * pow(2,3) + p2 * pow(2,2) + p1 * pow(2,1) + p0 * pow(2,0);
}

Gdy za parametry podstawiam

P3, P2, P1, P0 

to cały czas pokazuje mi zero, a jak podstawie zwykłe zmienne, którym nadam wartości 0 lub 1 to liczy prawidłowo. Wie ktoś dlaczego?

void BINtoDEC (int p3, int p2, int p1, int p0)
{
    cout <<"p3="<<p3<<"; p2="<<p2<<"; p1="<<p1<<"; p0="<<p0<<";"<<endl;
    cout << p3 * pow(2,3) + p2 * pow(2,2) + p1 * pow(2,1) + p0 * pow(2,0);
}

Napisałem to w pierwszej odpowiedzi, skoro nie rozumiesz to zobacz sam podstawiając to co wyżej, wynikami tych p0,p1,p2,p3 zawsze jest zero.

0
_13th_Dragon napisał(a):

Napisałem to w pierwszej odpowiedzi, skoro nie rozumiesz to zobacz sam podstawiając to co wyżej, wynikami tych p0,p1,p2,p3 zawsze jest zero.

Na pewno źle cię zrozumiałem ale powiem to. Te P0, P1, P2 i P3 nie zawsze równają się zero. Jeżeli w programie się wpisze przykładowy ciąg bitów, np. 10101010 to P0 = 1, P1 = 1, P2 = 1, a P3 = 0. Czyli nie zawsze przyjmują wartość zero.

0

Więc żeby P0, P1, P2 i P3 nie zwracały wartości 0 usunąłem w funkcji XOR wyrażenie

 return 0;

i zmieniłem jej typ na void lecz wraz nie za dużo to dało gdyż P0, P1, P2 i P3 nie można użyć jako parametrów (argumentów) funkcji BINtoDEC, bo wyskakują błędy, więc jak zamienić liczbę binarną na dziesiętną powstałą z wyników funkcji XOR w kolejności P3 P2 P1 P0 ?

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