Как я могу интерпретировать беззнаковое значение типа int как четырехбуквенное слово? - PullRequest
0 голосов
/ 02 октября 2019

Моя работа состоит в том, чтобы полностью изменить процесс, который я использовал в моей переменной int sum. Тем не менее, я должен использовать оператор модуля вместе с целочисленным делением. Вот мой код до сих пор.

#include <iostream>
#include <iomanip>
#include <string>
#include <cmath>

using namespace std;

int main(){
    string fourLetterWord;

    cout << setw(10) << "" << "Please enter a four letter word! ";
    while (cin >> fourLetterWord)
    {
        if (fourLetterWord.length() == 4)
        {
            cout << setw(10) << "" << "The ASCII value of " << fourLetterWord[3] << "=" << int(fourLetterWord[3]) << endl;
            cout << setw(10) << "" << "The ASCII value of " << fourLetterWord[2] << " = " << int(fourLetterWord[2]) << endl;
            cout << setw(10) << "" << "The ASCII value of " << fourLetterWord[1] << " = " << int(fourLetterWord[1]) << endl;
            cout << setw(10) << "" << "The ASCII value of " << fourLetterWord[0] << " = " << int(fourLetterWord[0]) << endl;

            int sum = fourLetterWord[3] * pow(2, 24) + fourLetterWord[2] * pow(2, 16) +  fourLetterWord[1] * pow(2, 8) + fourLetterWord[0] * pow(2, 0);

            cout << setw(10) << "" << "If the four bytes of " << fourLetterWord << " were read as an int, its value would be " << sum << endl;
            cout << setw(10) << "" << "Let's reverse the process. " << endl;
            cout << setw(10) << "" << "Enter an unsigned int value: ";
            while(cin >> sum)
            {
                cout << setw(10) << "" << sum % int(fourLetterWord[3]) * pow(2, 24) + sum %     (fourLetterWord[2]) * pow(2, 16) 
                + sum % int(fourLetterWord[1]) * pow(2, 8) + sum % int(fourLetterWord[0]) * pow(2, 0);
            }
        }
        else
        {
            cout << setw(10) << "" << "Please re-enter a four letter word.";
            cin >> fourLetterWord;
        }
    }
}

Когда я вывожу это, я получаю:

          Please enter a four letter word! FORE

          The ASCII value of E = 69
          The ASCII value of R = 82
          The ASCII value of O = 79
          The ASCII value of F = 70

          If the four bytes of FORE were read as an integer, its value would  be 1163022150
          Let's reverse the process. 
          Enter an unsigned integer value: 1163022150
          5.58767e+08 

Мне нужна помощь, чтобы получить значение 1163022150, чтобы стать словом FORE.

Ответы [ 2 ]

2 голосов
/ 03 октября 2019

Вы можете использовать операторы сдвига битов, чтобы выполнить преобразование в обоих направлениях. Вы не должны использовать std::pow. Это может привести к потере точности.

int sum = (fourLetterWord[0] << 24) +
          (fourLetterWord[1] << 16) +
          (fourLetterWord[2] << 8) +
          fourLetterWord[3];   // No need for shifting this number.

Обратите внимание, что я сдвигаю биты первого символа в строке на 24, а не четвертого символа в строке.

Вы можете извлечь символы с помощью битовой маскировки и сдвига вправо.

char digit1 = (sum & 0xFF000000) >> 24;
char digit2 = (sum & 0x00FF0000) >> 16;
char digit3 = (sum & 0x0000FF00) >> 8;
char digit4 = (sum & 0x000000FF); // No need for shifting this number.
0 голосов
/ 03 октября 2019

Вы можете разбить его так же, как если бы вы разложили десятичное число на 1-е место, 10-е место на 100-е место и т. Д.

Чтобы получить 1-е место, вы бы взяли остаток при делении на 10 (то есть num% 10).

Чтобы получить 10-е место, сначала нужно разделить на 10, а затем повторить тот же процесс: (num / 10)% 10.

Чтобы получить 100-е местосначала разделите на 100, а затем повторите тот же процесс: (num / 100)% 10.

В вашем примере вы используете не базу 10, а базу 2 ^ 8. Поэтому вам нужно будет настроить 10 на 2 ^ 8, а 100 (или 10 * 10) на 2 ^ 16 (или 2 ^ 8 * 2 ^ 8) и т. Д.

Что вы в итоге получитеэто что-то вроде:

fourLetterWord[0] = sum          % 2^8;
fourLetterWord[1] = (sum / 2^8)  % 2^8;
fourLetterWord[2] = (sum / 2^16) % 2^8;
fourLetterWord[3] = (sum / 2^24) % 2^8;
...