| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > проверка на чётность последовательности битов |
| Автор: supercelt 12.8.2015, 11:32 |
| Помогите пожалуйста разобраться как правильно. А то на вики пишут так, в другом месте сяк Есть последовательность из 5 битов. Первые 4 - это данные, 5й - бит чётности. 1101 - данные Вариант проверки 1 В этом коде 3 единицы, а 3 - нечётное число, значит бит чётности будет 1 Вариант 2 делается логическая И с маской 0001 1101 & 0001 = 0001 Получаем 1 - нечётное. Ну и правильно, 1101 это 13. А 13 нечётное А теперь 1111 - данные при первом варианте будет 0, так как там 4 единицы, а 4 - чётное во втором варианте будет 1 - нечётное, 1111 это 15 - нечётное число Так вот как правильно? |
| Автор: supercelt 12.8.2015, 11:46 |
| спс |
| Автор: TarasProger 12.8.2015, 14:25 |
| Это два разных бита чётности. В одном случае это бит, обеспечивающий чётность количества единичных бит во всей пятёрке, что связано с особенностями физического уровня протокола, а в другом это флаг чётности самого значения. |
| Автор: feodorv 12.8.2015, 16:38 |
Наверное, имелось в виду "четвёрке"? |
| Автор: TarasProger 12.8.2015, 18:53 |
| Пятёрке: 4 бита данных он не трогает, количество единичных бит в ней может быть любым, в том числе и нечётным, но в этом случае бит партитета тоже единичный и он то один, в сумме с битами данных количество единичных бит чётно, если же количество единичных бит данных уже чётно, то паритетный бит нулевой, в сумме опять таки количество единичных бит чётно. Добавлено @ 19:01 Например, единичные биты - одиночные импульсы чередующихся разрядностей, а ноли - отсутствие импульсов, + пилотон на весь пакет. Если количество единичных бит не чётно, то имеем не нулевую составляющую нулевой частоты, которая плохо идёт по кабелю, а если оно чётно, то всякие отличия среднего от ноля случайны, бит паритета даёт гарантию номинального ноля в компоненте нулевой частоты, а дрейф ноля можно не передавать, не страшно. Равное количество нолей и единц одним дополнительным битом не обеспечишь, для этого нужна 100% избыточность, да и договориться о том, какая полярость будет единицей, а какая нолём можно в одном устройтсве, но не в распределённой сети. А чётность количества единиц с меньшими затратами. Добавлено через 9 минут и 50 секунд Не надо рассказывать про самосинхронизацию каждого бита, это был просто максимально упрощённый пример. |
| Автор: supercelt 12.8.2015, 19:06 | ||
Да имелось ввиду в 4. пятый - бит чётности. Может тогда подскажете как работает эта функция. Описано что она проверяет 4 бита на чётность. Но я не понимаю смысл этой функции или... алгоритм
|
| Автор: feodorv 12.8.2015, 19:54 |
| Ну, тут явно идёт речь о байтах, не о битах. А как Вы в коде задаёте последовательность этих 4 или 5 бит? Добавлено через 36 секунд Да, прошу прощения. |
| Автор: feodorv 12.8.2015, 20:43 | ||||||
| Вычислить паритет 4-х младших бит целочисленной переменной можно по-разному. Например так:
Можно с использованием таблицы:
Объединяя биты паритета в таблице parityTable в одно число, получаем такую функцию:
|
| Автор: TarasProger 13.8.2015, 06:15 | ||
|
| Автор: TarasProger 13.8.2015, 06:49 | ||||
|
| Автор: TarasProger 13.8.2015, 07:31 | ||
Можно ещё сложить значения паритетов в массив, индексируемый значеними байтов.
Добавлено через 41 секунду Первый вариант конкетное отображение битовых полей на биты не учитывает. |
| Автор: TarasProger 13.8.2015, 07:58 |
| Аппаратура последовательного порта, сетевой карты с разъёмом BNC, или сетевой карты под витой кабель, исспользующей на передачу ровно одну пару жил кабеля, вполне справляется с передачей единичного бита, а кратность посылок восьми реализуется управлением этой аппаратурой, возможно даже программно или микропрограммно. При наличии битов чётнлости, паритета, или любых других дополниельных бит кратность оказывается другой. Но в принципе можно обеспечить такую кратность количества байт, чтоб снова получить кратность количества бит восьми, чтоб сформировать всю последовательность как есть в памяти. Например, пусть посылаются восьмибитные байты с паритетом на уровне полубайта. Тогда кратность 10. Но 5 байт равны как раз 40-ка байтам, что вполне кратно и восьми, и десяти. Тогда количество байт данных кратно 4-м, а 5-й байт содержит паритеты для всей четвёрки, но его биты можно перемешать с битами данных, разместив по одному после каждых четырёх бит данных. Если есть и чётность числа на уровне байта, и паритет на уровне полубайта, то получаем кратность 11, количество байт должно быть кратно 11, тогда количество бит будет кратно и 8-ми, и 11-ти: на каждые 8 байт данных приходится 3 байта дополнительной информации, перемешиваемых с данными так: 4 бита данных, 1 доплнительный (паритет старшего полубайта), 4 бита данных, 2 дополниельных (паритет младшего полубайта и чётность), 4 бита данных, 1 доплнительный (паритет старшего полубайта), 4 бита данных, 2 дополниельных (паритет младшего полубайта и чётность), 4 бита данных, 1 доплнительный (паритет старшего полубайта), 4 бита данных, 2 дополниельных (паритет младшего полубайта и чётность), 4 бита данных, 1 доплнительный (паритет старшего полубайта), 4 бита данных, 2 дополниельных (паритет младшего полубайта и чётность), 4 бита данных, 1 доплнительный (паритет старшего полубайта), 4 бита данных, 2 дополниельных (паритет младшего полубайта и чётность), 4 бита данных, 1 доплнительный (паритет старшего полубайта), 4 бита данных, 2 дополниельных (паритет младшего полубайта и чётность), 4 бита данных, 1 доплнительный (паритет старшего полубайта), 4 бита данных, 2 дополниельных (паритет младшего полубайта и чётность), 4 бита данных, 1 доплнительный (паритет старшего полубайта), 4 бита данных, 2 дополниельных (паритет младшего полубайта и чётность). При паритете на уровне полубайта и чётности числа в полубайте получам кратность количества бит 12-ти и кратность количества байт 3-м (3 байта - это 24 бита, кратно и 8-ми, и 12-ти), два дополниельных бита размещаются после каждых четырёх бит данных. Добавлено @ 08:00 Если иметь только паритет на уровне всего байта, то количество байт кратно 9-ти: 8 байт данных + 1 байт с паритетами. Обратите внимание: количество байт данных всё равно кратно степени двойки. |
| Автор: TarasProger 13.8.2015, 08:27 |
| Кроме лучшей передавабельности паритет может иметь и другое назначение с его помощью фиксируется факт наличия ошибок передачи любых бит в любом нечётном количестве. А одна ошибка вероятнее двух. |
| Автор: feodorv 13.8.2015, 10:16 | ||
TarasProger, у ТС есть последовательность 5 бит, при чем здесь байты? При чем здесь линии связи и всё остальное? Зачем всё это написанное? Вы окончательно запутываете тему. |
| Автор: xvr 13.8.2015, 13:16 | ||
Вы прослушали монолог 'О жизни битов' в исполнении TarasProger (бурные продолжительные аплодисменты) |