Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
drummer1
0 / 0 / 0
Регистрация: 16.11.2014
Сообщений: 31
1

Побитовая запись в переменную нескольких значений

20.09.2015, 09:15. Просмотров 977. Ответов 3
Метки нет (Все метки)

Доброго времени суток, прошу помощи в создании програмы которая должна считывать данные вводимые пользователем и побитово записывать их в переменную а потом выводить в такой же последовательности.
Например нужно заполнить переменную f (16 бит) значениями (чисельными) таким образом:

Слово состояния програмы в расчетной системы представляется в виде:

розряда 15____14__13___12___11___10____09___08___07___06___05___04__03___02____01___00
Значения C_____C___C____C____E____I_____P____0____0____0____K____K___K____0____0_____0

где:
C..C - маски каналов 0 - 3
E - маска внешнего перерывания
I - маска внутренего перерывания
P - маска програмного прерывания
KKK - ключ защиты памяти
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2015, 09:15
Ответы с готовыми решениями:

Запись в файл double нескольких значений
Нужно создать файл double и записать в него 3 введенных числа a, b, c. Как это...

побитовая запись в файл
можно ли записать отдельный бит в файл?

Побитовая запись в файл
Здравствуйте, передо мной стоит задача организовать побитовую запись в файл....

Процедура, записывающая в переменную X минимальное из значений X и Y, а в переменную Y – максимальное
Описать процедуру Minmax(X, Y), записывающую в переменную X минимальное из...

Запись даты в переменную
Народ, ктонибудь знает как записать в переменную сегодняшнюю дату (например...

3
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
20.09.2015, 11:58 2
Если я правильно понял вопрос.

Вариант 1:

C
#include <stdio.h>
 
typedef union
{
  unsigned short total;
  struct
  {
    /* Для big endian поля нужно перечислять в прямом порядке,
     * для little endian - в обратном */
    unsigned  :3; /* unused */
    unsigned k:3;
    unsigned  :3; /* unused */
    unsigned p:1;
    unsigned i:1;
    unsigned e:1;
    unsigned c:4;
  } fields;
} state_t;
 
int main (void)
{
  state_t s;
 
  s.total = 0;
  s.fields.c = 15;
  s.fields.e = 1;
  s.fields.i = 0;
  s.fields.p = 1;
  s.fields.k = 5;
 
  printf ("s.total = 0x%04x\n", s.total);
  return 0;
}
Вариант 2:

C
#include <stdio.h>
 
typedef unsigned short state_t;
 
/* От endian'а НЕ зависит. Функция является универсальной и работает
 * с произвольными значениями. Главное правильно настроить тип state_t */
static void
set_state_field (state_t *p, unsigned field_size, unsigned field_offset, state_t value)
{
  state_t mask;
 
  /* Величина, состоящая только из единиц размером field_size бит */
  mask = (1 << field_size) - 1;
 
  /* Избыточное действие на тот случай, если в value подано значение, которое
   * НЕ умещается в field_size бит. На всякий случай очистим старшие биты */
  value &= mask;
 
  /* В state_t обнулим те биты, которые соответсвуют положению field_size, field_offset */
  *p &= ~(mask << field_offset);
  
  /* На обнулённую дырку из предыдущей строки натянем value */
  *p |= (value << field_offset);
}
 
int main (void)
{
  state_t s;
 
  s = 0;
 
  /* Запись в поле c
   * size = 4, offset = 12 - самый младший бит, начиная с нуля */  
  set_state_field (&s, 4, 12, 15);
 
  /* Запись в поле e
   * size = 1, offset = 11 - самый младший бит, начиная с нуля */  
  set_state_field (&s, 1, 11, 1);
 
  /* Запись в поле i
   * size = 1, offset = 10 - самый младший бит, начиная с нуля */  
  set_state_field (&s, 1, 10, 0);
 
  /* Запись в поле p
   * size = 1, offset = 9 - самый младший бит, начиная с нуля */  
  set_state_field (&s, 1, 9, 1);
 
  /* Запись в поле k
   * size = 3, offset = 9 - самый младший бит, начиная с нуля */  
  set_state_field (&s, 3, 3, 5);
 
  printf("s=0x%04x\n", s);
 
  return 0;
}
0
drummer1
0 / 0 / 0
Регистрация: 16.11.2014
Сообщений: 31
20.09.2015, 12:12  [ТС] 3
Спасибо большое!Но Увы неправильно (поняли). Значения которые побитово записываются в переменную должны быть введены пользователем. Тоесть пользователь должен ввести 5 значений, 5 чисел:
C..C - маски каналов 0 - 3 1е
E - маска внешнего перерывания 2е
I - маска внутренего перерывания 3е
P - маска програмного прерывания 4е
KKK - ключ защиты памяти 5е
0
Evg
Эксперт CАвтор FAQ
19289 / 7148 / 528
Регистрация: 30.03.2009
Сообщений: 20,000
Записей в блоге: 30
20.09.2015, 12:40 4
Я тебе показал технику, как это делается (грубо говоря то, о чём в учебниках обычно не пишут). Если после этого ты наотрез отказываешься думать своей головой и ждёшь, что кто-то за тебя допишет всё остальное - флаг тебе в руки, жди
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2015, 12:40

Запись из файла в переменную
#pragma hdrstop #pragma argsused #include &lt;tchar.h&gt; #include &lt;stdio.h&gt;...

Неверная запись в переменную
Вечер добрый, форумчане. Столкнулся с довольно странной для меня проблемой....

Запись данных в переменную и в файл
Помогите студенту! Надо написать программу для DOS, которая записывает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru