Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 8 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 02.06.2005
Откуда: Khabarovsk
Здравствуйте.

В программе возникла необходимость составить байт и записать его в файл. Насколько мне известно в С++ работать напрямую с двоичными числами нельзя (т.е. устанавливать отдельные биты). Поэтому я решил использовать для записи шестнадцатеричные числа.

Пытаюсь получить число примерно так:

Код:
#define ZERO  0x0
#define ONE    0x1
..
..
#define SIM_E 0xe
#define SIM_F 0xf

char bait [8];
char _minB[4], _maxB[4]; // старшая и младшая четверка бит
char hex = '';
char tem = '';
..
// переменная biat устанавливается в функцией и содержит набор 1 и 0 соответственно.
..
for (short int i = 1; i < 5; i++)
  _maxB[i] = bite[i];
// также заполняем старшую четверку бит

switch (_maxB)
{
  case '0000' : hex = ZERO;
  case '0001' : hex = ONE;
  ..
  ..
  case '1111' : hex = SIM_F
}

hex = hex << 4; // сдвигаем биты на четыре

switch (_minB)
{
  case '0000' : tem = ZERO;
  case '0001' : tem = ONE;
  ..
  ..
  case '1111' : tem = SIM_F
}

hex = hex + tem; // складываем старшие четыре байта и младшие, т.е. получаем искомое шестнадцатеричное число.


Этот код не работоспособен. Т.к. переменные _minB и _maxB не корректно обрабатываются структурой switch. "Пляски с бубном" не помогают.

Может кто знает как реализовать такое, желательно с применением только чистого С++. Или если кто знает другой способ буду очень благодарен.



Партнер
 

Member
Статус: Не в сети
Регистрация: 30.01.2003
Откуда: Москва
spmn Во-первых, тогда уж не C++, а просто C. Во-вторых, можно и в чистом C.
Бинарные операции: &, |, ~, ^ - "и", "или", "не", "xor" соответственно.
Установить отдельный бит: a = a | ( 1 << n )
Очистить отдельный бит: a = a & ~( 1 << n )
Изменить бит на противоположный: a = a ^ ( 1 << n )
Изменить все биты на противоположные: a = ~a или a = a ^ (-1)

Не путать с логическими &&, ||, !.


 

Advanced member
Статус: Не в сети
Регистрация: 09.06.2003
Откуда: USSR
spmn писал(а):
Насколько мне известно в С++ работать напрямую с двоичными числами нельзя (т.е. устанавливать отдельные биты)

Откуда такие странные познания то???


 

Непонятно, что значит case '0000' и зачем это?
В С/C++ действительно нет ввода/вывода в BIN ( т.е. BIN <-> String ). Но возможно это просто исправить с пом-ю бинарных операций (см. выше). Получится очень компактно и элегантно (без всяких .... )(switch - must die, for - 4ever!!).


 

Member
Статус: Не в сети
Регистрация: 02.06.2005
Откуда: Khabarovsk
Спасибо. Все ясно :)

Добавлено спустя 1 час, 33 минуты, 17 секунд:
Ray Adams
Ray Adams писал(а):
Откуда такие странные познания то???

Прочитал в конференции ixbt.com :)


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
spmn
std::bitvec тебя спасет.
1. оператор [] позволяет получить значение требуемого бита
2. оператор type () позволит тебе получить двоичное число в виде требуемого типа.

_________________
Цель жизни - d20 по жизни...


 

Member
Статус: Не в сети
Регистрация: 02.06.2005
Откуда: Khabarovsk
Avaddon
Avaddon писал(а):
std::bitvec тебя спасет

Простите конечно за некомпетентность, но что это ? :spy:


 

Member
Статус: Не в сети
Регистрация: 15.04.2004
Откуда: Москва
В языке Це++ есть такое понятие - STL (Standart Template Library). Это очень мощный механизм, с помощью которого очень удобно обрабатывать данные. Изучить STL если ты программируешь на C++ ты просто обязан. Есть однако, некоторое "но". Любимая всеми компания (Microsoft) как всегда, пошла своим путем, и STL в их интерпретации несколько отличается от стандарта от HP.
P.S. Извиняюсь за опечатку, только что заметил. Конечно же не std::bitvec, а std::bitset.

_________________
Цель жизни - d20 по жизни...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 8 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan