পৃথিবী আর প্রতিবেশী ছায়াপথগুলোর মধ্যে প্রতি মিলিসেকেন্ডে ট্রিলিয়ন ট্রিলিয়ন বার্তা ছুটে চলে। কিন্তু এত দীর্ঘ দূরত্বে বার্তা পাঠানো মোটেই সহজ কাজ নয়। বিরক্তিকর সৌরঝড়, কালের বিকৃতি, বিপথগামী বল, এমনকি মহাকাশের একটি প্রজাপতির ডানার ঝাপটাও ট্রান্সমিশনের সময় যেকোনো একটি বিট এলোমেলোভাবে বদলে দিতে পারে।
এখন এর পরিণতির কথা একবার ভাবুন:
নষ্ট হয়ে যাওয়া বার্তা শনাক্ত করা শুধু গুরুত্বপূর্ণই নয়, তা অত্যন্ত জরুরি। বিপর্যয় ঘটার আগেই কিছু ভুল হয়েছে কি না, তা রিসিভারের অবশ্যই জানা দরকার।
কিন্তু কীভাবে? মহাবিশ্বের নানা প্রান্তের বিজ্ঞানী আর ইঞ্জিনিয়াররা যুগ যুগ ধরে এই সমস্যার সঙ্গে লড়াই করছেন। গোটা মহাজাগতিক AI সুপারক্লাস্টার ডেটা চষে চলে। তারপর একদিন এক কিংবদন্তি আবার ভেসে ওঠে: এক প্রাচীন, শক্তিশালী পদ্ধতি, যা ডিবাগিং ফোরামে ফিসফিস করে আলোচিত হয়, আর অনেক বেশি দেখে ফেলা ইঞ্জিনিয়ারদের মুখে বিড়বিড় করে উচ্চারিত হয়...
প্যারিটি বিট!
এত সহজ, এত শক্তিশালী এক পদ্ধতি, যে হয়তো এটি আন্তঃনক্ষত্রীয় যোগাযোগকেই রক্ষা করে দেবে।
আপনার কাজ হলো বাস্তবায়নে সহায়তা করা:
প্যারিটি বিট হলো ট্রান্সমিশন এরর শনাক্ত করার একটি সহজ উপায়।
ট্রান্সমিটার ও রিসিভারগুলো একবারে ঠিক আট বিট ট্রান্সমিট ও রিসিভ করতে পারে (প্যারিটি বিটসহ)।
প্যারিটি বিট এমনভাবে সেট করা হয় যাতে প্রতিটি ট্রান্সমিশনে জোড় সংখ্যক 1 বিট থাকে, এবং প্যারিটি বিট সবসময় ডান দিক থেকে প্রথম বিট।
তাই রিসিভার যদি 11000001, 01110101 বা 01000000 পায় (অর্থাৎ এমন একটি ট্রান্সমিশন, যেখানে বিজোড় সংখ্যক 1 বিট আছে), তাহলে সেটি জানে যে একটি এরর আছে।
তবে মেসেজ সাধারণত এত ছোট হয় না, আর বড় হলে সেগুলো একটি সিকোয়েন্সে ট্রান্সমিট করতে হয়।
উদাহরণ হিসেবে 11000000 00000001 11000000 11011110 (অথবা হেক্সে C0 01 C0 DE) মেসেজটি ধরা যাক।
যেহেতু প্রতিটি ট্রান্সমিশনে ঠিক আট বিট থাকে, তাই এতে সাত বিট ডেটা আর একটি প্যারিটি বিটের বেশি থাকতে পারে না। তাই প্রতি সাত বিট ডেটার পরে একটি প্যারিটি বিট বসাতে হয়:
11000000 00000001 11000000 11011110
↑ ↑ ↑ ↑ (7th bits)
এই মেসেজের ট্রান্সমিশন সিকোয়েন্স দেখতে এমন হয়:
1100000_ 0000000_ 0111000_ 0001101_ 1110
↑ ↑ ↑ ↑ (parity bits)
সিকোয়েন্সের প্রথম ট্রান্সমিশনের ডেটায় (1100000) দুটি 1 বিট আছে (জোড় সংখ্যা), তাই প্যারিটি বিট 0।
প্রথম ট্রান্সমিশনটি হয় 11000000 (অথবা হেক্সে C0)।
পরের ট্রান্সমিশনের ডেটায় (0000000) কোনো 1 বিট নেই (আবারও জোড় সংখ্যা), তাই প্যারিটি বিট আবারও 0।
তাই দ্বিতীয় ট্রান্সমিশনটি হয় 00000000 (অথবা হেক্সে 00)।
পরের দুইটি ট্রান্সমিশনের ডেটায় (0111000 ও 0001101) তিনটি 1 বিট আছে।
এদের প্যারিটি বিট 1 করা হয়, যাতে ট্রান্সমিশনে জোড় সংখ্যক 1 বিট থাকে।
এগুলো 01110001 ও 00011011 হিসেবে ট্রান্সমিট হয় (অথবা হেক্সে 71 ও 1B)।
শেষ ট্রান্সমিশনে (1110) মাত্র চার বিট ডেটা আছে।
যেহেতু একবারে ঠিক আট বিট ট্রান্সমিট হয় আর প্যারিটি বিট হলো সবচেয়ে ডান দিকের বিট, তাই তিনটি 0 বিট আর তারপর প্যারিটি বিট যোগ করে আট বিট পূর্ণ করা হয়।
এখন এটি দেখতে এমন হয় (যেখানে _ হলো প্যারিটি বিট):
1110 000_
↑↑↑ (added 0 bits)
এখানে আবারও বিজোড় সংখ্যক 1 বিট আছে, তাই প্যারিটি বিট 1।
সিকোয়েন্সের শেষ ট্রান্সমিশনটি হয় 11100001 (অথবা হেক্সে E1)।
এই মেসেজের সম্পূর্ণ ট্রান্সমিশন সিকোয়েন্স হলো 11000000 00000000 01110001 00011011 11100001 (অথবা হেক্সে C0 00 71 1B E1)।
Exercism-এ সাইন আপ করুন, ARM64 Assembly ট্র্যাকের 78টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।