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)
Непонятно, что значит case '0000' и зачем это?
В С/C++ действительно нет ввода/вывода в BIN ( т.е. BIN <-> String ). Но возможно это просто исправить с пом-ю бинарных операций (см. выше). Получится очень компактно и элегантно (без всяких .... )(switch - must die, for - 4ever!!).
Member
Статус: Не в сети Регистрация: 15.04.2004 Откуда: Москва
spmn std::bitvec тебя спасет.
1. оператор [] позволяет получить значение требуемого бита
2. оператор type () позволит тебе получить двоичное число в виде требуемого типа.
Member
Статус: Не в сети Регистрация: 15.04.2004 Откуда: Москва
В языке Це++ есть такое понятие - STL (Standart Template Library). Это очень мощный механизм, с помощью которого очень удобно обрабатывать данные. Изучить STL если ты программируешь на C++ ты просто обязан. Есть однако, некоторое "но". Любимая всеми компания (Microsoft) как всегда, пошла своим путем, и STL в их интерпретации несколько отличается от стандарта от HP.
P.S. Извиняюсь за опечатку, только что заметил. Конечно же не std::bitvec, а std::bitset.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения