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

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

20.09.2015, 09:15. Показов 3003. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2015, 09:15
Ответы с готовыми решениями:

Хаффман- побитовая запись в файл. ПОБИТОВАЯ=)
Снова хаффман...помогите придумать как побитово вести запись в файл,ведь коды хаффмана не равны...

Вывод нескольких значений из БД в переменную
Добрый день! Помогите решить проблему. Есть 2 таблицы, первая "items", вторая "items_have"....

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

Побитовая запись
Подска

3
Evg
Эксперт CАвтор FAQ
21228 / 8241 / 636
Регистрация: 30.03.2009
Сообщений: 22,596
Записей в блоге: 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
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
21228 / 8241 / 636
Регистрация: 30.03.2009
Сообщений: 22,596
Записей в блоге: 30
20.09.2015, 12:40 4
Я тебе показал технику, как это делается (грубо говоря то, о чём в учебниках обычно не пишут). Если после этого ты наотрез отказываешься думать своей головой и ждёшь, что кто-то за тебя допишет всё остальное - флаг тебе в руки, жди
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.09.2015, 12:40

Запись сразу нескольких значений
Подскажите как мне записать в переменную сразу несколько значений? idpath in ; idpath := ;

Побитовая запись в файл
Добрый день уважаемые форумчане. Возникла некая трудность при выполнении задания на сжатия. Дело в...

Побитовая запись в файл на C#
Нужно написать алгоритм сжатия Хаффмана, сам алгоритм, как я его вижу, будет выглядеть так: 1)...

Побитовая запись в файл
Доброго предоброго всем времени суток! Нужно написать библиотеку в матлаб, которая позволила бы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru