DevLab

Qalaktikalararası Paritet Biti

Orta
bitwisehexadecimalencoding
3000 ms
256 MB

Yer və qonşu qalaktikalar arasında hər millisaniyədə trilyonlarla mesaj ötürülür. Lakin bu qədər uzun məsafələrə məlumat göndərmək olduqca qəliz məsələdir. Zəhlətökən günəş partlayışları, zaman-məkan təhrifləri, kənar qüvvələr və hətta kosmik bir kəpənəyin qanad çırpması belə ötürülmə zamanı təsadüfi bir bitin dəyişməsinə (xətaya) səbəb ola bilər.

İndi nəticələri təsəvvür edin:

  • "Aşağıdan al" mesajı "İndi sat"a çevrildikdə Qalaktikalararası Birjanın çökməsi.

  • "Yeni soxulcan dəliyini yadda saxla" mesajı "Yeni soxulcan dəliyini məhv et" olduqda Kepler sisteminin yox olması.

  • Yaxud sadəcə kovboy emojisinin (🤠) kloun emojisinə (🤡) çevrilməsi ilə bütün kainatın ekzistensial dəhşətə qərq olması...

Xarab olmuş mesajları aşkar etmək sadəcə vacib deyil — bu həyati əhəmiyyət daşıyır.

Kainatın hər yerindən olan alimlər və mühəndislər əsrlər boyu bu problemlə mübarizə aparıblar. Nəhəng kosmik süni intellekt klasterləri dayanmadan məlumatları analiz etdi. Və bir gün, əfsanəvi, qədim və güclü bir metod, çox şey görmüş veteran mühəndislərin gizli forumlarında pıçıldanmağa başladı... Paritet Biti (The Parity Bit)!

O qədər sadə və güclü bir metod ki, ulduzlararası rabitəni yalnız o xilas edə bilər.

Sizin vəzifəniz bu kodlama sistemini quran iki əsas funksiyanı yazmaqdır:

  1. Transmitter (Ötürücü): Standart mesajı "Paritet bitləri" ilə zənginləşdirib təhlükəsiz ötürülmə ardıcıllığına çevirən (Encode) alqoritm.

  2. Receiver (Qəbuledici): Gələn şifrələnmiş mesajdakı paritet bitlərini yoxlayıb orijinal mesaja çevirən (Decode) alqoritm.

Paritet Biti Qaydaları:

Ötürücülər və qəbuledicilər eyni anda tam olaraq 8 bit göndərib qəbul edə bilərlər.

Paritet biti elə təyin edilir ki, hər bir 8 bitlik blokda '1' bitlərinin sayı cüt (even) olsun. Paritet biti həmişə sağdan 1-ci (ən kiçik/sonuncu) bitdir. Əgər qəbuledici içində tək sayda '1' olan bir blok alarsa, deməli yolda xəta baş verib.

Kodlama (Encode) Alqoritmi:

Məsələn, 0xc0 0x01 0xc0 0xde (Hex) mesajını göndəririk:

İkili (Binary) forması: 11000000 00000001 11000000 11011110

Bunu ardıcıl birləşdirib 7-bitlik data bloklarına bölməliyik:

1100000, 0000000, 0111000, 0001101, 1110

Hər blokun sonuna 1 ədəd paritet biti elə əlavə edilməlidir ki, tərkibindəki '1'lərin ümumi sayı cüt olsun. Və sonuncu blok əgər 7 bit deyilsə, arxasına 0-lar artırılıb daha sonra paritet biti əlavə edilərək 8 bitə tamamlanmalıdır.

Yekun kodlanmış nəticə belə olacaq: 0xc0 0x00 0x71 0x1b 0xe1

Açma (Decode) Alqoritmi:

Bu isə yuxarıdakı prosesin tam əksidir. Qəbuledici mesajı alır, hər 8-bitlik blokdakı '1'lərin sayını sayır. Əgər say təkdirsə, deməli məlumat yolda korlanıb! Əgər cütdürsə, paritet bitini atır və qalan 7 bitlik hissələri yenidən birləşdirərək standart 8-bitlik orijinal mesaja qaytarır.

Giriş verilənləri:

1-ci sətirdə ENCODE və ya DECODE əməliyyatının adı verilir.

2-ci sətirdə massivin uzunluğunu bildirən N tam ədədi verilir.

3-cü sətirdə 0x prefiksi ilə başlayan onaltılıq (Hexadecimal) formatında N ədəd bayt verilir (aralarında boşluqla). Əgər $N=0$ olarsa, bu sətir boşdur.

Çıxış verilənləri:

  • Əgər DECODE rejimində paritet xətası aşkarlanarsa, sadəcə wrong parity çap edin.

  • Uğurlu əməliyyatlarda isə nəticəni yenə 0x prefiksli kiçik hərflərlə yazılmış onaltılıq (Hexadecimal) formatda çap edin. Məsələn: 0x03 0x00 (Tək rəqəmli hex dəyərlərində 0x2 yox, 0x02 formasında həmişə 2 simvol qorunmalıdır).

1Nümunə 1:
Giriş:
ENCODE 1 0x02
Çıxış:
0x03 0x00
2Nümunə 2:
Giriş:
ENCODE 4 0xc0 0x01 0xc0 0xde
Çıxış:
0xc0 0x00 0x71 0x1b 0xe1
REDAKTOR
Giriş edin
Giriş:
ENCODE 1 0x02
Çıxış:
0x03 0x00