T
TSY
В рассматриваемом в задаче сообщение представляет собой поток байтов. При этом каждые четыре бита сообщения дополняются четырьмя проверочными битами, вычисленными по следующему правилу (символом ⊕ обозначена сумма по модулю 2, операция xor):
x4 = x0 ⊕ x1 ⊕ x2
x5 = x1 ⊕ x2 ⊕ x3
x6 = x0 ⊕ x2 ⊕ x3
x7 = x4 ⊕ x5 ⊕ x6
Таким образом, каждый байт сообщения кодируется двумя байтами, при этом первый по порядку байт содержит младшие четыре бита исходного байта сообщения и проверочные биты, а второй — старшие четыре бита исходного байта и проверочные биты, например:
Исходное сообщение длиной в один байт: 0xAE (двоичный код - 10101110), младшая половина 0xE (1110), старшая половина 0xA (1010).
Кодируем младшую половину:
x4 = 0 ⊕ 1 ⊕ 1 = 0
x5 = 1 ⊕ 1 ⊕ 1 = 1
x6 = 0 ⊕ 1 ⊕ 1 = 0
x7 = 0 ⊕ 1 ⊕ 0 = 1
Кодируем старшую половину:
x4 = 0 ⊕ 1 ⊕ 0 = 1
x5 = 1 ⊕ 0 ⊕ 1 = 0
x6 = 0 ⊕ 0 ⊕ 1 = 1
x7 = 1 ⊕ 0 ⊕ 1 = 0
Итоговые два байта: 0xAE (10101110) 0x5A (01011010)
необходимо написать программу для декодирования сообщения, сконструированного по заданным выше правилам
Программа получает закодированное сообщение на стандартный ввод, результат печатается на стандартный вывод.
Гарантируется (не требуется проверка), что при передаче сообщения исключены ошибки типа "потеря бита" и "включение бита". Другими словами длина биты сообщения гарантированно находятся на своих местах, а проверочные на своих. Длина сообщения в байтах гарантированно кратна двум. Также гарантируется, что каждый байт сообщения содержит не более одной битовой ошибки.
Необходимые битовые операции (установка заданного номером бита, например) должны быть оформлены в виде отдельных функций.
Написать программу для раскодирования сообщения, не обращая внимание на корректирующие коды (предполагая, что ошибок не было). Таким образом, достаточно собрать один байт из каждой пары, склеив младшие тетрады.
Подскажите хотя бы идейку,а то как-то совсем туго...
x4 = x0 ⊕ x1 ⊕ x2
x5 = x1 ⊕ x2 ⊕ x3
x6 = x0 ⊕ x2 ⊕ x3
x7 = x4 ⊕ x5 ⊕ x6
Таким образом, каждый байт сообщения кодируется двумя байтами, при этом первый по порядку байт содержит младшие четыре бита исходного байта сообщения и проверочные биты, а второй — старшие четыре бита исходного байта и проверочные биты, например:
Исходное сообщение длиной в один байт: 0xAE (двоичный код - 10101110), младшая половина 0xE (1110), старшая половина 0xA (1010).
Кодируем младшую половину:
x4 = 0 ⊕ 1 ⊕ 1 = 0
x5 = 1 ⊕ 1 ⊕ 1 = 1
x6 = 0 ⊕ 1 ⊕ 1 = 0
x7 = 0 ⊕ 1 ⊕ 0 = 1
Кодируем старшую половину:
x4 = 0 ⊕ 1 ⊕ 0 = 1
x5 = 1 ⊕ 0 ⊕ 1 = 0
x6 = 0 ⊕ 0 ⊕ 1 = 1
x7 = 1 ⊕ 0 ⊕ 1 = 0
Итоговые два байта: 0xAE (10101110) 0x5A (01011010)
необходимо написать программу для декодирования сообщения, сконструированного по заданным выше правилам
Программа получает закодированное сообщение на стандартный ввод, результат печатается на стандартный вывод.
Гарантируется (не требуется проверка), что при передаче сообщения исключены ошибки типа "потеря бита" и "включение бита". Другими словами длина биты сообщения гарантированно находятся на своих местах, а проверочные на своих. Длина сообщения в байтах гарантированно кратна двум. Также гарантируется, что каждый байт сообщения содержит не более одной битовой ошибки.
Необходимые битовые операции (установка заданного номером бита, например) должны быть оформлены в виде отдельных функций.
Написать программу для раскодирования сообщения, не обращая внимание на корректирующие коды (предполагая, что ошибок не было). Таким образом, достаточно собрать один байт из каждой пары, склеив младшие тетрады.
Подскажите хотя бы идейку,а то как-то совсем туго...