কম্পিউটার সম্পর্কে আমরা যা প্রথম জিনিস শিখি সেটা হলো সেগুলো শুধু ০ এবং ১ বুঝতে পারে, অর্থাৎ বিট।
আমরা মানুষ দশমিক পদ্ধতিতে সংখ্যা কমিউনিকেট করি। এই সিস্টেম ০ থেকে ৯ পর্যন্ত ডিজিট এবং প্লাস/মাইনাস চিহ্ন (+ এবং -) ব্যবহার করে পজিটিভ বা 네가েটিভ সংখ্যা নির্দেশ করে।
যেহেতু কম্পিউটার শুধু দুটি ডিজিট—০ এবং ১—ব্যবহার করতে পারে, তাই অতীতের ইঞ্জিনিয়ার এবং গণিতবিদরা 네가েটিভ সংখ্যা রিপ্রেজেন্ট করার এবং সেগুলোর সাথে আর্থমেটিক করার চমৎকার টেকনিক খুঁজে বের করেছিল। সেগুলোর সৌন্দর্য এক্সপ্লোর করি।
প্রথমে, কম্পিউটার কীভাবে কাজ করে সে সম্পর্কে কিছু পটভূমি
সফটওয়্যার, ছবি, টেক্সট, ভিডিও, সংখ্যা—সব কিছু কম্পিউটারের নিম্নতম স্তরে ০ এবং ১।
ছবি, টেক্সট, ভিডিও এবং সংখ্যার জন্য এনকোডিং স্কিম থাকে যেগুলো সিদ্ধান্ত নেয় এগুলো ০ এবং ১-এ কীভাবে রূপান্তরিত হবে। উদাহরণস্বরূপ, টেক্সটের জন্য ASCII এবং Unicode।
আমরা যা সফটওয়্যার প্রোগ্রাম কোড করি সেগুলো কম্পাইলার এবং অ্যাসেম্বলারের মাধ্যমে ০ এবং ১-এ রূপান্তরিত হয়। সেটা যেটা মেশিন কোড (বা মেশিন ইনস্ট্রাকশন) নামে পরিচিত, সেগুলো প্রথমে কম্পিউটারের মেইন মেমরি (RAM)-এ স্টোর হয় প্রসেসর এক্সিকিউট করার আগে।
প্রসেসর এক্সিকিউশন সাইকেল শুরু করে মেইন মেমরি থেকে ইনস্ট্রাকশন ফেচ করে, তারপর প্রসেসরের কন্ট্রোল ইউনিট সেগুলো ডিকোড করে দুটি অংশে—অপারেশন কোড (opcode) এবং অপারেন্ড।
Opcode সিদ্ধান্ত নেয় যে আরো কী অ্যাকশন নেয়া উচিত—যেমন ADD (যোগ), JMP (জাম্প), INC (ইনক্রিমেন্ট) ইত্যাদি। অপারেন্ড হলো ভ্যালু (বা মেমরি লোকেশন) যেগুলোর ওপর অপারেশন হবে।
ডিকোডেড ইনস্ট্রাকশন অ্যারিথমেটিক অ্যান্ড লজিক ইউনিট (ALU)-এ পাঠানো হয় এক্সিকিউশন-এর জন্য। ALU-এ, ইনস্ট্রাকশন opcode এবং অপারেন্ডের ওপর এক্সিকিউট হয় এবং রেজাল্ট মেমরিতে ফিরে স্টোর হয়।
উদাহরণস্বরূপ, অ্যাসেম্বলি কোড ADD eax, 42 প্রথমে অ্যাসেম্বলার দিয়ে মেশিন কোড (০ এবং ১) এ রূপান্তরিত হয়। তারপর ফেচ-ডিকোড-এক্সিকিউট সাইকেল শুরু হওয়ার আগে এটি মেইন মেমরিতে স্টোর হয়।
যখন ADD eax, 42-র মেশিন কোড মেমরি থেকে ফেচিং কমপ্লিট হয়, ইনস্ট্রাকশন ডিকোড হয়। ডিকোডেড আউটপুট বলে opcode হলো ADD এবং অপারেন্ড হলো eax এবং 42।
eax একটি রেজিস্টার—প্রসেসরে বিল্ট-ইন একটি মেমরি লোকেশন যাকে প্রসেসর ইনস্ট্যান্টলি এক্সেস করতে পারে। eax রেজিস্টার অধিকাংশ প্রসেসরে এক্যুমুলেটর বলা হয়।
ADD eax, 42 অ্যাসেম্বলি কোড eax রেজিস্টারের (এক্যুমুলেটর) বর্তমান ভ্যালুতে ৪২ যোগ করে সেটা eax-এ স্টোর করার জন্য ডিজাইন করা। অর্থাৎ eax = eax + 42।
মান লেন বর্তমানে eax হলো ২০। তাহলে ADD eax, 42 এক্সিকিউট হলে eax-এর ভ্যালু হবে ২০ + ৪২ = ৬২।
EDVAC-এর মতো প্রারম্ভিক কম্পিউটার ডিজাইন শুরু হয়েছিল কঠিন গাণিতিক গণনা সহজ ও দ্রুত করার ইচ্ছা থেকে।
কম্পিউটারকে কম্পিউট করানোর পুরো দায়িত্ব ছিল অ্যাডার্স (adders)-এর ওপর—যে সার্কিট দুটি সংখ্যা যোগ করে। কারণ সাবট্র্যাকশন, মাল্টিপ্লিকেশন, এবং ডিভিশনের মতো জটিল অপারেশন তাদের সার্কিটে অ্যাডার্স ব্যবহার করে।
চূড়ান্তভাবে কম্পিউটার হলো লজিক ক্যাপাবিলিটির সাথে একটি দ্রুত আর্থমেটিক মেশিন। বাইনারি আর্থমেটিক ডিজাইন (পজিটিভ এবং বিশেষ করে 네가েটিভ ইন্টিজার) এর চ্যালেঞ্জ এবং সৌন্দর্য বুঝা কম্পিউটার প্রসেসরের সবচেয়ে মৌলিক ধারণার একটা।
চলুন প্রথমে দেখি ডেসিমেল নম্বর বাইনারি-এ কীভাবে রিপ্রেজেন্ট হয় এবং দুটি বাইনারি ভ্যালু কীভাবে যোগ করা হয়। তারপর সৌন্দর্যের দিকে যাব।
বাইনারি সিস্টেম কীভাবে কাজ করে
আমি আপনাকে 872500 রিড আউট করতে বললে, আপনি বলবেন ৮৭২.৫K। আমাদের মস্তিষ্ক কীভাবে এটা করে সেটা দেখি।
ডান দিক থেকে প্রথম ডিজিটকে ওয়ানস প্লেস, দ্বিতীয়কে টেনস প্লেস, তৃতীয়কে হান্ড্রেডস প্লেস এসাইন করি, এবং এভাবে প্রতিবার ১০ এর ঘাত দ্বারা বৃদ্ধি পায়।
প্রতিটি প্লেসের এই ১০ এর ঘাতগুলো হলো প্লেসের ওজন (weight)। হান্ড্রেডস প্লেসের ওজন একশ। প্রতিটি প্লেসের ডিজিটকে তার প্লেসের ওজন দিয়ে গুণ করে সব যোগ করলে পূর্ণ সংখ্যা পাওয়া যায়।
উপরের ডায়াগ্রামে দেখুন, প্রতিটি প্লেসের ওজন ১০ এর ঘাতে বৃদ্ধি পাচ্ছে, 10^0 থেকে 10^5 পর্যন্ত। তাই ডেসিমেলকে বেস টেন সিস্টেম বলা হয়।
বাইনারিতে, প্রতিটি প্লেসের ওজন ২ এর ঘাতে বৃদ্ধি পায়। অর্থাৎ প্লেসের ওজন 2^0 থেকে শুরু হয় এবং 2^something-এ শেষ হয়। এটাই একমাত্র পার্থক্য।
00110101 ডেসিমেলে ৫৩। কম্পিউটার বাইনারি ইন্টারপ্রেট করে মানব দশমিক ইন্টারপ্রেট করার মতোই—প্রতিটি প্লেসের ডিজিটকে তার ওজন দিয়ে গুণ করে সব যোগ করে।
১ এবং ০ কীভাবে যোগ করবেন
বাইনারিতে যোগ দশমিক পদ্ধতির মতোই কাজ করে। একটি উদাহরণ দিয়ে দেখি। দুটি বাইনারি নম্বর যোগ করব: 1101 (১৩) এবং 1100 (১২)।
দশমিক সিস্টেমের মতো, আমরা ওয়ানস প্লেস (2^0) থেকে শুরু করি। ১ এবং ০ যোগ করলে ১। তাই সেখানে ১ রেখে দিই। ধৈর্য ধারুন, পুরো ছবি বুঝতে পারবেন।
০ যোগ ০ হলো ০। চলুন।
১ যোগ ১ হলো ২। আর বাইনারিতে ২ রিপ্রেজেন্ট হয় 10। আমরা ১ কেরি করি পরবর্তী প্লেসে এবং বর্তমান প্লেসে ০ রেখে দিই। দশমিক যোগফলে ৯ অতিক্রম করার মতোই নাকি?
এখানে দুটি ১ এবং আগের প্লেস থেকে কেরি করা ১—মোট তিনটি ১। যোগফল ৩, বাইনারিতে ৩ হলো 11। তাই 11 লিখি। ফাইনাল রেজাল্ট 11001 বা ডেসিমেলে ২৫, যা ১৩ + ১২-এর ঠিক ফলাফল।
উপরের কম্পিউটেশন ধরে নিচ্ছে আমাদের রেজাল্ট স্টোর করার জন্য ৫ বিট আছে। যদি ৪-বিট কম্পিউটার এডিশন করে, তবে রেজাল্ট স্টোর করার জন্য শুধু ৪ বিট থাকবে।
পঞ্চম বিটটি ৪-বিট কম্পিউটারে ওভারফ্লো বলা হবে। ইন্টিজার আর্থমেটিকে, ওভারফ্লো বিট ইগনোর বা ডিসকার্ড করা হয়। তাহলে আমরা 1001 (৯) পেতাম যদি ৪-বিট কম্পিউটার ব্যবহার করতাম।
বাইনারি আর্থমেটিক ডিজাইনের সৌন্দর্য
আগে বুঝতে হবে দুটি গুরুত্বপূর্ণ টার্ম: লিস্ট সিগনিফিক্যান্ট বিট এবং মোস্ট সিগনিফিক্যান্ট বিট।
ডান পাশের বিটটি লিস্ট সিগনিফিক্যান্ট বিট কারণ এর প্লেস ওজন সবচেয়ে ছোট (2^0)। আর বাম পাশের বিটটি মোস্ট সিগনিফিক্যান্ট বিট কারণ এর প্লেস ওজন সবচেয়ে বেশি (2^7)।
যদি বিশ্বে শুধু পজিটিভ নম্বর থাকত, তবে এই আর্টিকেল এখানেই শেষ হত (কারণ আমরা ইতিমধ্যে শিখেছি ডেসিমেল বাইনারি-এ কীভাবে রিপ্রেজেন্ট করা যায় এবং কীভাবে বাইনারিতে যোগ করা যায়)।
শুক্রে, 네가েটিভ নম্বরও আছে।
CPU-এর আর্থমেটিক ডিজাইনের সৌন্দর্য 네가েটিভনেস-এ নিহিত।
তো কম্পিউটার 네가েটিভ সংখ্যা কীভাবে রিপ্রেজেন্ট করে, এবং 네가েটিভ সংখ্যার সাথে আর্থমেটিক কীভাবে কাজ করে? একটি এনকোডিং আপ্রোচ দিয়ে এটা দেখি।
নোট: নিচের সেকশনে আমরা ৪-বিট কম্পিউটার দিয়ে কাজ করব কনসেপ্ট বুঝতে, অর্থাৎ পঞ্চম বিট ওভারফ্লো হিসেবে বিবেচিত হবে। একই প্রিন্সিপল সব CPU আর্কিটেকচারে (১৬-বিট, ৩২-বিট, ৬৪-বিট) আর্থমেটিক করার জন্য প্রযোজ্য।
সাইন ম্যাগনিটিউড এনকোডিং আপ্রোচ
এই এনকোডিং স্কিমে 1101 ডেসিমেলে -৫ হবে। বাম পাশের বা মোস্ট সিগনিফিক্যান্ট বিট হলো সাইন বিট। এটি প্রসেসকে বলে সংখ্যার সাইন—অর্থাৎ সংখ্যা পজিটিভ কিনা 네가েটিভ।
0 সাইন বিটে মানে পজিটিভ ভ্যালু এবং 1 মানে 네가েটিভ ভ্যালু। বাকি বিটগুলো পরিমাণ (magnitude) বলে।
1101-এ, সাইন বিট 1, তাই সংখ্যা 네가েটিভ। 101 ডেসিমেলে ৫। তাই 1101 কম্পিউট করবে -৫।
উপরের ডায়াগ্রামে এই এনকোডিং আপ্রোচে ৪ বিটে রিপ্রেজেন্টেবল সব ইন্টিজার দেখানো হয়েছে। এ পর্যন্ত সব ভালো লাগছে।
তবে ঘুরে দেখলে একটি গम्भীর ডিজাইন ইস্যু দেখা যায়। সেটা ফেস করি।
একটি পজিটিভ এবং একটি 네가েটিভ নম্বর যোগ করি। উদাহরণস্বরূপ +৪ এবং -১ যোগ করি। আউটপুট হওয়া উচিত (+4) + (-1) = (+3) অর্থাৎ 0011।
দেখুন, রেজাল্ট 1101 (-৫)। আসল আউটপুট হওয়া উচিত 0011 (+৩)। এই আপ্লিকেশন প্রসেসরে ইমপ্লিমেন্ট করলে এই ইস্যু হ্যান্ডেল করার জন্য এডিশনাল লজিক লাগত। এবং ইঞ্জিনিয়াররা তাদের লজিকে অতিরিক্ত জটিলতা ঘৃণা করে।
আমরা যত বেশি সার্কিট যোগ করি, পাওয়ার কনসাম্পশন বাড়ে এবং পারফরম্যান্স কমে।
এটি আধুনিক ট্রানজিস্টর-ভিত্তিক কম্পিউটারের জন্য তুচ্ছ লাগতে পারে।
তবে EDVAC-এর মতো প্রারম্ভিক কম্পিউটার চিন্তা করুন যা হাজার হাজার ভ্যাকিউম টিউব দিয়ে চলে, কিলোওয়াট পাওয়ার খায়, সैकડ়ে মানুষ দিনরাত চালাত, এবং সরকার লক্ষ লক্ষ ডলার খরচ করেছিল।
সেই দিনে এডিশনাল সার্কিট এবং ভ্যাকিউম টিউব মানে হাজার হাজার ডলার এবং গুরুতর মেইনটেনেন্স সমস্যা।
তাই ইঞ্জিনিয়াররা একটি স্মার্টার এনকোডিং ডিজাইন খুঁজতে বাধ্য হলো।
এখন সেই সৌন্দর্যের আগমন যেটা এই সমস্যা সমাধান করবে এবং সিস্টেমকে সিম্পল, বেশি পারফরম্যান্ট, এবং কম পাওয়ার-হাঙ্গরি বানাবে।
একটি সুন্দর এনকোডিং সিস্টেম আসে এবং CPU চমকে উঠে ❤️
এই এনকোডিং স্কিমে, আগের মত বামপাশের বিট সাইন বিট হিসেবে কাজ করে—কিন্তু 네가েটিভ সংখ্যা রিপ্রেজেন্ট করার জন্য কিছু কালা নিয়ে।
পজিটিভ সংখ্যাগুলো আগের এনকোডিং স্কিমের মতোই রিপ্রেজেন্ট হয়: লিডিং 0 এবং বাকি বিট পরিমাণের জন্য। উদাহরণস্বরূপ, এই স্কিমেও ৬ হবে 0110।
নেগেটিভ নম্বর রিপ্রেজেন্ট করতে, এর পজিটিভ কাউন্টারপার্টে দুই ধাপের ম্যাথ প্রসেস চলে। অর্থাৎ -৬ পেতে +৬-এ দুই ধাপের ম্যাথ প্রসেস চালাতে হবে।
-6 কীভাবে বাইনারিতে এনকোড হবে:
পূর্বের সাইন ম্যাগনিটিউড আপ্রোচে, +৬-এর 네가েটিভ পেতে সাইন বিট 0 থেকে 1 করতাম। 0110 (+৬) হয়ে যেতো 1110 (-৬)।
এই নতুন এনকোডিং স্কিমে, প্রথমে বিটগুলো ইনভার্ট করি। শূন্যকে এক, এককে শূন্য। 0110 (+৬) হয়ে যায় 1001। বিট ইনভার্ট করাকে "ওন্স কমপ্লিমেন্ট" বলে, তাই এখানে আমরা 0110-এর ওন্স কমপ্লিমেন্ট ক্যালকুলেট করলাম 1001। তারপর...
0001 (+১) যোগ করি স্টেপ ১-এ পাওয়া ওন্স কমপ্লিমেন্টে (1001)। রেজাল্ট 1010 হবে -৬-এর বাইনারি রিপ্রেজেন্টেশন। এই এনকোডিং স্কিমকে টু'স কমপ্লিমেন্ট বলা হয়। তাই মনে রাখবেন, একটি পজিটিভ ইন্টিজারের টু'স কমপ্লিমেন্ট ক্যালকুলেট করলে তার 네가েটিভ কাউন্টারপার্ট পাওয়া যায়।
বিট ইনভার্ট করলে ওন্স কমপ্লিমেন্ট পাওয়া যায়। ওন্স কমপ্লিমেন্টে এক যোগ করলে আসল বিটের টু'স কমপ্লিমেন্ট পাওয়া যায়। সিম্পল, ঠিক না?
এখন দেখি কেন এই এনকোডিং স্কিম এতটুকু সুন্দর। 0100 (+৪) এবং 1111 (-১) যোগ করি।
দेखুন, টু'স কমপ্লিমেন্ট এনকোডিং স্কিমে এক্যুরেট রেজাল্ট পাওয়া যাচ্ছে। এখন আমরা চিন্তা ছাড়া ইন্টিজার যোগ করতে পারি, তাদের সাইন কী তা ভেবে না।
আমরা শিখলাম কীভাবে 네가েটিভ ইন্টিজার ০ এবং ১-এ টু'স কমপ্লিমেন্ট এনকোডিং দিয়ে রিপ্রেজেন্ট করা যায়। এখন ধরুন ADD eax, -3 এক্সিকিউট করলাম এবং eax রেজিস্টারের বর্তমান ভ্যালু -১। তাহলে ADD eax, -3 এক্সিকিউশনের পর eax-এ ভ্যালু হবে -৪ (যা টু'স কমপ্লিমেন্টে 1100)।
যখন অপারেটিং সিস্টেম eax থেকে 1100 রিট্রিভ করে ইউজারকে রেজাল্ট দেখাতে, OS 1100-কে ডেসিমেলে কীভাবে ডিকোড করে? অথবা আমরা প্রোগ্রামার হিসেবে 1100 দেখলে, কীভাবে বুঝব 1100 কী রিপ্রেজেন্ট করে?
বildet, প্রতিটি পজিটিভ ইন্টিজারের টু'স কমপ্লিমেন্ট ক্যালকুলেট করে দেখতে পারব না যখন 1100 পাওয়া যাবে। এটা খুব স্লো হবে।
প্রোগ্রামার এবং OS টু'স কমপ্লিমেন্টের একটি সুন্দর প্রোপার্টি ব্যবহার করে বাইনারি ডেসিমেলে ডিকোড করে।
যখন পজিটিভ নম্বরের টু'স কমপ্লিমেন্ট ক্যালকুলেট করি, তার 네가েটিভ কাউন্টারপার্ট পাওয়া যায়। খুব ভালো, বিপরীতটিও সত্য—অর্থাৎ একটি 네가েটিভ নম্বরের টু'স কমপ্লিমেন্ট ক্যালকুলেট করলে তার পজিটিভ কাউন্টারপার্ট পাওয়া যায়। এক মিনিটে এটার কারণ দেখব।
প্রথমে, OS বা প্রোগ্রামার 1100-কে ডেসিমেলে কীভাবে ডিকোড করে সেটা বুঝি।
1100 eax থেকে রিট্রিভ করলে, OS সাইন বিট হিসেবে 1 দেখে যা সংকেত দেয় ইন্টিজার 네가েটিভ। 1100-এর টু'স কমপ্লিমেন্ট ক্যালকুলেট করা হয় যা 1100-এর পজিটিভ কাউন্টারপার্ট দেয়, যা আসে 0100 (+৪) হিসেবে। OS তারপর পজিটিভ কাউন্টারপার্টে 네가েটিভ সাইন যোগ করে ফাইনাল আউটপুট -৪ রিটার্ন করে। এই প্যারাগ্রাফটি একবার আবার পড়ুন, বুঝতে পারবেন।
তারপর CPU হেসে আজকের জন্য সৌন্দর্যকে বিদায় বলে ;)
CPU তার বাড়িতে মায়ের সাথে मिलতে গিয়েছে। এখন আমাদের पास 충분 সময় আছে টু'স কমপ্লিমেন্টের কালার ভেতরের কাজকাজ আলোচনা করতে।
কেন এবং কীভাবে টু'স কমপ্লিমেন্ট এনকোডিং কাজ করে?
আমি আপনাকে বলি একটি নম্বরের 네가েটিভ বের করতে, ধরে নিন +৪২, সিম্পলেস্ট উপায় কী? 일련되게, সংখ্যাকে ০ থেকে বিয়োগ করা, ঠিক না? 0 - (+42) = -42। এটাকে রিপিট করলে পজিটিভ ভ্যালু ফিরে পাওয়া যায়, 0 - (-42) = +42। টু'স কমপ্লিমেন্টের সকল গণিতের ভিত্তি এটাই।
আমরা করছি 10000 (ডেসিমেলে ০ যেহেতু বামপাশের ১ ওভারফ্লো) মাইনাস 0101 (+৫)। পাওয়া যাচ্ছে 1011 যা টু'স কমপ্লিমেন্ট এনকোডিং-এ -৫। সাবট্রাকশন কীভাবে হয় সেটা গুরুত্বপূর্ণ নয়। টু'স কমপ্লিমেন্টের ইন্টুইশন বুঝা গুরুত্বপূর্ণ।
10000 কে লিখা যায় 1111 + 0001 হিসেবে (যোগ করে দেখুন, 10000 পাওয়া যাবে)। তাই আসলে আমরা করছি:
10000 - 0101 => (1111 + 0001) - 0101
উপরোক্ত ইকুয়েশন রিয়ারেঞ্জ করলে:
(1111 + 0001) - 0101 => (1111 - 0101) + 0001
Step 1: subtract 0101 from 1111
1 1 1 1
- 0 1 0 1
---------
1 0 1 0
দেখুন, 0101 কে 1111 থেকে বিয়োগ করা সমান বিট ইনভার্ট করার, কারণ আমরা 1010 পেলাম।
Step 2: add 0001 to the above result
1 0 1 0 ---> result of step 1
+ 0 0 0 1
---------
1 0 1 1
আমরা পেলাম 1011 যা টু'স কমপ্লিমেন্ট এনকোডিং-এ -৫।
দেখলেন টু'স কমপ্লিমেন্ট সিস্টেম মৌলিকভাবে ০ মাইনাস নম্বর করছে? বিট ইনভার্ট করলে এক যোগ করা নম্বরকে ০ থেকে বিয়োগ করার দ্রুত এবং চমৎকার উপায়।
এটাই কারণ আমরা একটি 네가েটিভ নম্বরের টু'স কমপ্লিমেন্ট করলে এর পজিটিভ কাউন্টারপার্ট পাই, এবং পজিটিভ নম্বরের টু'স কমপ্লিমেন্ট করলে এর 네가েটিভ কাউন্টারপার্ট পাই—কারণ আসলে আমরা নম্বরকে ০ থেকে বিয়োগ করছি (0 - number)।
১৯০০-এর দশকের কম্পিউটারগুলোর শুধু যোগ আর্থমেটিক লজিক रहता কারণ টু'স কমপ্লিমেন্ট এনকোডিং স্কিম এতটুকু সুন্দর যে সাবট্রাকশন সহজে পারফর্ম করা যায়।
উদাহরণস্বরূপ, ১২ কে ১০০ থেকে বিয়োগ করতে, CPU +১২-এর টু'স কমপ্লিমেন্ট ক্যালকুলেট করে যা -১২ প্রডিউস করে, তারপর -১২ কে ১০০-এর সাথে যোগ করে প্রয়োজনীয় আউটপুট পায়।
কেন সরাসরি ০ থেকে বিয়োগ না করি 네가েটিভ নম্বর রিপ্রেজেন্ট করতে বা বিপরীত কাজে?
কারণ সাবট্রাকশন একটি স্লো এবং জটিল প্রসেস (বরোইং-এর কারণে) তাই আমাদের কম্পিউটারকে একটি ব্যয়বহুল সাবট্রাকশন সার্কিট লাগবে যদি ওই পথে যাই। প্রতিবার 네가েটিভ ইন্টিজার রিপ্রেজেন্ট করতে ০ থেকে বিয়োগ করা আমাদের এবং কম্পিউটারদের জন্য কাবুস হবে!
টু'স কমপ্লিমেন্ট এনকোডিং আরও পারফরম্যান্ট সমাধান, সিম্পল সার্কিট ডিজাইন, এবং অনেক টাকা বাঁচায়। কারণ আমাদের ব্যয়বহুল সাবট্রাকশন সার্কিট দরকার নেই এবং + এবং - ইন্টিজারের আর্থমেটিকের জন্য এডিশনাল লজিক দরকার নেই। শুধু সাদা যোগ এবং আমরা যোগ-বিয়োগ দুটোই করতে পারি।
তাই আমাদের কম্পিউটার ডিজাইনারদের এই সুন্দর এনকোডিং স্কিম—টু'স কমপ্লিমেন্ট ❤️—এর জন্য কৃতজ্ঞ থাকা উচিত।
শেষ কথা
আমি নিজের সাথে প্রতিজ্ঞা করেছিলাম যে আমি কখনো শেখার মাটিরিয়ালের জন্য চার্জ করব না। শিক্ষার জন্য আমি যা কিছু করি—চায়া একটি আর্টিকেল হোক বা কোর্স বা ইবুক—সব ১০০% ফ্রি এবং ওপেন থাকবে।
আমি আমার টুইটার একাউন্টে ইউজফুল রিসোর্স পোস্ট করি এবং মেনিংফুল চিন্তা শেয়ার করি। আমাকে সেখানে ফলো করুন এবং এই আর্টিকেল থেকে কিছু নতুন শিখলে DM পাঠান। আমার দিনটা ভালো যাবে :)
প্রতিটি ডেভেলপার, প্রতিটি লেখক, এবং প্রতিটি মানুষ কেউ কেউ থেকে শিখে। আমি মনে করি যাদের থেকে শিখি তাদের সাইট করা উচিত এবং ছড়িয়ে দেয়া উচিত। এতে ভালো মানুষরা আমাদের সবার জন্য আরও বেশি করতে উৎসাহিত হয়। তাই এখানে আমার ভালো মানুষরা।
অনিমেষ (mycodeschool) আমাকে অন্যের চেয়ে ভালো প্রোগ্রামিং কনসেপ্ট শিখিয়েছেন, যার মধ্যে এই আর্টিকেলে লিখা কনসেপ্টগুলোও রয়েছে।
আন্দ্রে ইয়েনিস (André Jaenisch), আমার মেন্টর এবং বন্ধু, তার রিভিউইং এফর্ট এবং নিরন্তর সাপোর্ট ছাড়া আমি এই আর্টিকেল লিখতে পারতাম না।
শুভ শিক্ষা!