@BMinhoj

Как найти значения отдельных составных частей?

60c261506af3e406787721.png
Задание
Составить две программы, первая из которых вводит составные части структуры данных, приведённой в индивидуальном варианте, как десятичные числа и формирует из них заданную упакованную структуру как 16-ричное число. Вторая программа вводит упакованную структуру как 16-ричное число и выводит значения отдельных её составных частей как десятичные числа.


Мой код выдаёт ошибку. Помогите пожалуйста исправить:
#include <bits/stdc++.h>

using namespace std;

int main()
{
    system("chcp 1251");
    char s; /* код системной области */
    char d; /* признак «грязного» буфера */
    char f; /* признак свободного буфера */
    unsigned char b; /*    номер блока */
    unsigned int UnitStateWord; /* Блок управления  */
  /* ввод блока управления  */
    cout << "Введите блок управления  \n";
    cout << "(16-ричное число от 0 до 0xFFFF) >";
    scanf("%x",&UnitStateWord);
  /* Выделение составных частей */
    s = (UnitStateWord>>13)&0x1F;
    d = (UnitStateWord>>11)&1;
    f = (UnitStateWord>>9)&1;
    b = UnitStateWord&0xFF;
  /* вывод результатов */
    cout << endl;
    cout << "Код  системной области" << s << endl;;
    cout << "Признак «грязного» буфера " << d << endl;;
    cout << "Признак свободного буфера " << f << endl;;
    cout << "Номер блока " << b << endl;;
    return 0;

}
  • Вопрос задан
  • 303 просмотра
Пригласить эксперта
Ответы на вопрос 2
gdt
@gdt
Программист
Какую ошибку выдаёт ваш код?
Для удобства попробуйте сначала применять маску, а потом сдвигать (если программа выводит неправильные значения):
s = (UnitStateWord & 0xD000) >> 13;
d = (UnitStateWord & 0x0800) >> 11;
f = (UnitStateWord & 0x0200) >> 9;
b = UnitStateWord & 0x00FF;


Также рекомендую на всякий случай сразу же после scanf вывести считанное число при помощи printf, чтобы на 100% быть уверенным что вы сдвигаете именно то что нужно.
Ответ написан
@res2001
Developer, ex-admin
У вас маска для S не правильная (0x1F - 5 битов), судя по заданию должна быть 7 (3 бита). Но в целом это не должно влиять на результат, т.к. S последнее поле и при сдвиге свободные биты будут заполняться нулями.
Приведите пример входное значение и что получаете на выходе.

Так же было бы не плохо после ввода проверить введенное значение UnitStateWord на попадание в диапазон. Т.к. переменная может принимать гораздо более широкий диапазон значений.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы