Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2011, 20:45   #1
NightEagle
Пользователь
 
Регистрация: 13.03.2011
Сообщений: 31
По умолчанию битовые поля

такая задача.
4 байта информации раскодировать в 2 байта. 24 первых бита раскодируются след. образом: три бита заменяются одним, в который записывается та из цифр (0 или 1), которая встречается в триаде бит по крайне мере дважды. Остальные 8 бит, просто переписываются.

сделал такую структуру:
Код:
struct BIT
{
	unsigned int t1:3;
	unsigned int t2:3;
	unsigned int t3:3;
	unsigned int t4:3;
	unsigned int t5:3;
	unsigned int t6:3;
	unsigned int t7:3;
	unsigned int t8:3;
	unsigned int s:8;
}
если не логично то подскажите как нужно

подскажите:
1) как переписать 8 битов?
2) каким образом можно проверить тройку битов на наличие 0 / 1?

результирующие 2 байта хочу сохранить в объекте типа wchar_t
NightEagle вне форума Ответить с цитированием
Старый 31.05.2011, 20:53   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
int value;  // 32 bit value
int result = 0; // only 16 low bits are used
//
for (int i = 0; i < 8; i++) 
{
  switch (value & 7) {
    case 3:
    case 5:
    case 6:
    case 7: result |= 0x80000000;
  }
  //
  value >>= 3;
  result >>= 1;
}
//
result >>= 24;
value <<= 8;
result |= value;
типа того, мысли вслух
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 31.05.2011, 20:58   #3
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Логично. Теперь можно попробовать сделать так:
Код:
union
{
   BIT cut_data;
   unsigned char bytes[4];
   char input1_data[4];
   // или unsigned input2_data;
};
Считать в input1_data посимвольно или числом в input2_data (в зависимости от условия задачи), 8 последних получаем в bytes[3], затем проходимся по полям вашей структуры и сравниваем с уже подсчитанными и переведенными в дес. СС константами, например:
000 = 0
001 = 1
010 = 2
100 = 4
- значит у нас 2 нуля
111 = 7
110 = 6
101 = 5
011 = 3
- значит 2 единицы
И, работая бин. сдвигом, записываем в какую нибудь переменную unsigned char, после чего выводим.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 31.05.2011, 21:13   #4
NightEagle
Пользователь
 
Регистрация: 13.03.2011
Сообщений: 31
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Код:
int value;  // 32 bit value
int result = 0; // only 16 low bits are used
//
for (int i = 0; i < 8; i++) 
{
  switch (value & 7) {
    case 3:
    case 5:
    case 6:
    case 7: result |= 0x80000000;
  }
  //
  value >>= 3;
  result >>= 1;
}
//
result >>= 24;
value <<= 8;
result |= value;
типа того, мысли вслух
насколько я понял это вариант с использованием логических операций. нужно сделать используя битовые поля, никак не могу понять как
NightEagle вне форума Ответить с цитированием
Старый 31.05.2011, 21:17   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> нужно сделать используя битовые поля

а, сорри, но всё-равно код будет похожий, битовые поля просто делают ненужными операции сдвига
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 31.05.2011, 21:29   #6
NightEagle
Пользователь
 
Регистрация: 13.03.2011
Сообщений: 31
По умолчанию

если я правильно понял преподавателя, то когда мне нужно использовать битовые поля, нельзя использовать операции подобного рода |, &, ^
это абсурд? или такое можно реализовать?
NightEagle вне форума Ответить с цитированием
Старый 31.05.2011, 22:17   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> нельзя использовать операции

можно, почему. просто тут не нужно

если уж всё делать битовыми полями, надо быть последовательными до конца, результат тоже описать типа:

Код:
struct RES
{
	unsigned int r1:1;
	unsigned int r2:1;
	unsigned int r3:1;
	unsigned int r4:1;
	unsigned int r5:1;
	unsigned int r6:1;
	unsigned int r7:1;
	unsigned int r8:1;
	unsigned int rs:8;
}
и дальше 8 раз проверять одно и то же:

Код:
BIT b;
RES r;
//
switch (b.t1) {
    case 3:
    case 5:
    case 6:
    case 7: r.r1 = 1;
} // и так 8 раз, для t2/r2, t3/r3 ...
ну и завершающий аккорд:

Код:
r.rs = b.s;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 31.05.2011, 22:58   #8
NightEagle
Пользователь
 
Регистрация: 13.03.2011
Сообщений: 31
По умолчанию

> и дальше 8 раз проверять одно и то же
восемь раз писать switch?
NightEagle вне форума Ответить с цитированием
Старый 31.05.2011, 23:05   #9
NightEagle
Пользователь
 
Регистрация: 13.03.2011
Сообщений: 31
По умолчанию

Код:
switch (b.t1) {
    case 3:
    case 5:
    case 6:
    case 7: r.r1 = 1;
}

Код:
switch (b.t2) {
    case 3:
    case 5:
    case 6: r.r2 = 1;
    //case 7: r.r1 = 1;
}

switch (b.t3) {
    case 3:
    case 5: r.r3 = 1;
    //case 6:
    //case 7: r.r1 = 1;
}
как-то так? или же я что-то не понял?
NightEagle вне форума Ответить с цитированием
Старый 01.06.2011, 08:18   #10
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> восемь раз писать switch?

угу, или вспомнить, что С — это процедурный язык, и сваять нечто:

Код:
int checkBits(unsigned int bits)
{
  switch (bits) {
    case 3:
    case 5:
    case 6:
    case 7: return 1;
  } 
  return 0;
}
//
r.r1 = checkBits(b.t1);
r.r2 = checkBits(b.t2);
r.r3 = checkBits(b.t3);
r.r4 = checkBits(b.t4);
r.r5 = checkBits(b.t5);
r.r6 = checkBits(b.t6);
r.r7 = checkBits(b.t7);
r.r8 = checkBits(b.t8);
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
битовые поля и операции NightEagle Общие вопросы C/C++ 5 25.05.2011 19:08
Битовые операции(с++) Lazy maximka Помощь студентам 2 23.12.2010 18:55
Битовые поля Inna_L Общие вопросы C/C++ 1 14.10.2010 12:14
80 битовые переменные Ra88 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 09.10.2010 14:40
битовые поля Arcueid1691 Общие вопросы C/C++ 8 03.12.2009 00:37