Бинарный код в серый и наоборот

Поэтому я хочу написать программу, которая принимает двоичное значение в качестве входного и преобразует его в серый код и наоборот.

Вот что я написал изначально:

#include <iostream>

using namespace std;

int main()
{

int Choice;
bool g0,g1,g2,g3,b0,b1,b2,b3;

cout<<"For Binary To Gray Code Enter 1." << endl <<"For Gray Code to Binary Enter 2." << endl;;
cin>>Choice;

if(Choice==1)
{

cout<<"Enter the Binary Bits." << endl;

cin>>b0>>b1>>b2>>b3;cout<<"Orginal Binary Form: "<<b3 <<b2 <<b1 <<b0 << endl;

g3=b3;
g2=b3^b2;
g1=b2^b1;
g0=b1^b0;

cout<<"Converted Gray Code Form: "<<g3 <<g2 <<g1 <<g0 << endl;
}
else if(Choice==2)
{

cout<<"Enter The Gray Code Bits." << endl;

cin>>g0>>>g1>>g2>>g3;cout<<"Original Gray Code Form: "<<g3 <<g2 <<g1 <<g0 << endl;

b3=g3;
b2=b3^g2;
b1=b2^g1;
b0=b1^g0;

cout<<"Converted Binary Form: "<<b3 <<b2 <<b1 <<b0 << endl;
}

return 0;
}

Теперь это работает для 4 бит, но

  1. Я хочу что-то, что определяет размер введенного двоичного / серого кода пользователем во время выполнения.

    Я провел небольшое исследование и узнал об использовании векторов в таком случае, но так как в колледже мы только начали C ++, я не знаком с векторами или даже массивами. Есть ли что-то еще, что я могу использовать для достижения этого? Если нет, может кто-нибудь сказать мне, как векторы могут быть использованы для этого?

  2. Во-вторых, я хочу взять ввод в одну строку без пробелов.

    Пример:

    1011 скорее, чем 1 0 1 1 или принимая вход для каждого бита в отдельной строке.

  3. Теперь я также понимаю, что я не смогу узнать нет. битов заранее, поэтому формула битов, которую я использовал для выполнения операции XOR, также будет изменена. Можно ли объявить двоичный и серый код bool переменная и как-то выполнить операцию XOR над этими переменными, а не отдельные биты, используя более простые операторы, ничего сложного?

1

Решение

Вы можете прочитать строку и оценить символ за раз, чтобы начать что-то вроде этого:

#include <iostream>
#include <string>

using namespace std;

int main()
{
std::string input
int Choice;

cout<<"For Binary To Gray Code Enter 1." << endl <<"For Gray Code to Binary Enter 2." << endl;;
cin>>Choice;
cout << "Enter input string: ";
cin >> input;

if(Choice==1)
Gray2Binary(input.c_str(), input.length());
else
Binary2Gray(input.c_str(), input.length());

return 0;
}

void Gray2Binary(char s[], int n)
{
int state = s[0]=='1' ? 1 : 0;
int i=0;

do {
if (i > 0)
state ^= s[i++]=='1' ? 1 : 0;

cout << state;
}while (i<n);

cout << endl;
}
1

Другие решения

Это стоило мне 30 минут, чтобы написать, проверить и отладить.

#include <iostream>
#include <cstdlib>
#include <string>

using namespace std;

void printReverse(bool* arr, int size){
for(int i = size - 1; i >= 0 ; i--)
cout << arr[i];
cout << endl;
}
int main(){
int choice;
string str;

cout << "For Binary To Gray Code Enter 1." << endl
<< "For Gray Code to Binary Enter 2." << endl;
cin >> choice;

if( choice != 1 && choice != 2)
return 1;

if(choice == 1) cout << "Enter the Binary Bits." << endl;
else cout << "Enter the Gray Code Bits." << endl;

cin >> str;

int size = str.size();
bool arr[size];

for(int i = 0; i < size; i++)
if(str[i] == '0')
arr[i] = false;
else
arr[i] = true;

if(choice == 1) cout << "Orginal Binary Form: ";
else cout << "Orignal Gray Code Form: ";

printReverse(arr, size);

if(choice == 1){
for(int i = 0; i < size - 1 ; i++) // explain 1
arr[i] = arr[i] ^ arr[i + 1];
cout << "Converted Gray Code Form: ";
printReverse(arr, size);
} else {
for(int i = str.size() - 2; i >= 0 ; i--) // explain 2
arr[i] = arr[i] ^ arr[i + 1];
cout << "Converted Binary Form: ";
printReverse(arr, size);
}
system("pause");
return 0;
}

printReverse: (возьмите 4 бита в качестве примера)

cout << arr[3]; // cout << b3; or cout << g3;
cout << arr[2]; // cout << b2; or cout << g2;
cout << arr[1]; // cout << b1; or cout << g1;
cout << arr[0]; // cout << b0; or cout << g0;

объяснить 1: (возьмите 4 бита в качестве примера)

// at the beggining, arr[0], arr[1], arr[2], arr[3] are b0, b1, b2, b3
arr[0] = arr[0] ^ arr[1]; // g0 = b0 ^ b1; // arr[0] becomes g0 after assignment
arr[1] = arr[1] ^ arr[2]; // g1 = b1 ^ b2; // arr[1] becomes g1 after assignment
arr[2] = arr[2] ^ arr[3]; // g2 = b2 ^ b3; // arr[2] becomes g2 after assignment
arr[3] = arr[3];          // g3 = b3;      // arr[3] becomes g3 after assignment

объяснить 2: (возьмите 4 бита в качестве примера)

// at the beggining, arr[0], arr[1], arr[2], arr[3] are g0, g1, g2, g3
arr[3] = arr[3];          // b3 = g3;      // arr[3] becomes b3 after assignment
arr[2] = arr[2] ^ arr[3]; // b2 = g2 ^ b3; // arr[2] becomes b2 after assignment
arr[1] = arr[1] ^ arr[2]; // b1 = g1 ^ b2; // arr[1] becomes b1 after assignment
arr[0] = arr[0] ^ arr[1]; // b0 = g0 ^ b1; // arr[0] becomes b0 after assignment
0

По вопросам рекламы [email protected]