من از قبل میدانستم که کامپیوترها از منطق صفر و یک استفاده میکنند. هر اطلاعاتی که روی کامپیوترها وجود دارد از یک متن ساده بگیر تا یک فایل موسیقی یا یک فیلم سینمایی در دنیای کامپیوتر رشتهای از اعداد صفر و یک است اما سوالی که برام پیش آمده بود این بود که چرا در علم کامپیوتر از سیستم باینری استفاده میکنیم؟
در الکترونیک و در سیستمهای کامپیوتری و دیجیتالی، به منظور انتقال اطلاعات از اعداد دودویی یا باینری (binary) که در قالب 0 و 1 هستند استفاده میشود.
جواب ساده و خلاصه سخت افزار و قوانین فیزیک است. اطلاعات در سخت افزار به شکل سیگنالهای الکتریکی جابجا میشود. پس منطقا ما دو حالت خواهیم داشت، وجود جریان و عدم وجود جریان یا همان صفر و یک.
تبدیل اعداد دسیمال به باینری کار سختی نیست. تنها کاری که باید انجام بدیم تقسیم متوالی عدد مورد نظر به دو است. به عنوان مثال میخواهیم عدد ۱۰ را در دستگاه باینری بنویسم.
به عنوان یک برنامه نویس تازهکار که در ابتدای راه است و سعی میکند هرچیزی را برای خودش تبدیل به یک چالش برنامه نویسی کند تصمیم گرفتم کدی بنویسم که یک عدد دسیمال را بگیرد و مقدار باینریاش را برگرداند.
در دو خط اول یک عدد صحیح از کاربر میگیرم و دخل یک متغییر به نام number ذخیره میکنم. در ادامه یک متغییر موقتی به نام temp هم تعریف کردم که از جنس string هست.از خط ۶ تا ۱۷ حلقه while را داریم. اول از همه number را به ۲ تقسیم میکنیم اگر باقیمانده برابر با صفر شد ۰ را به متغییر temp اضافه میکنم در غیر اینصورت ۱ را به temp اضافه میکنیم. فکر میکنم الان مشخض شد که چرا temp را از نوع string تعریف کردم.
در نهایت مقدار number را به number / 2 تغییر میدهیم و این حلقه تا زمانی که مقدار number کوچکتر مساوی ۱ بشود ادامه دارد. اما کد ما یک مشکل کوچک دارد. عدد باینری به صورت برعکس داخل متغییر temp ذخیره میشود. یعنی به ازای عدد ۱۰ داخل متغییر temp عدد ۰۱۰۱ را خواهیم داشت. از آنجایی که من یک مقدار پایتون هم میدانم سعی کردم مستقیم خود رشته را برعکس کنم اما به نظر میرسد این امکان در زبان سیشارپ وجود ندارد.
در خط ۱۸ و ۱۹ متغییر temp را به Array تبدیل میکنیم و با استفاده از متد Reverse برعکسش میکنیم. بعد در خط ۲۱ تا ۲۵ Array برعکس شده را داخل یک متغییر جدید بنام newStr ذخیره میکنیم و در خط ۲۶ مقدار باینری را نمایش میدیم.
تبدیل اعداد باینری به دسیمال هم کار راحتی است. برای انجام اینکار باید به ارزش مکانی اعداد توجه کنیم. اولین عدد در سمت چپ بیشترین ارزش مکانی را دارد و اولین عدد در سمت راست کمترین ارزش را و اگر از سمت راست به چپ حرکت کنیم ارزش مکانی هر عدد دو برابر عدد قبلیاش است.یعنی ارزش مکانی اولین عدد از سمت چپ برابر است با ۲ به توان ۰، عدد دوم ۲ به توان ۱ عدد سوم ۲ به توان ۲ و الی به آخر. برای به دست آوردن مقدار دسیمال اعداد باینری باید صفر و یکها را در ارزش مکانیشان ضرب کنیم و با هم جمع کنیم.
اگر متوجه توضیحات من نشدید تصویر زیر میتواند کمک کند.
مثل تبدیل اعداد دسیمال به باینری برای تبدیل اعداد باینری به دسیمال هم کد نوشتم.
این بار هم در دو خط اول مقدار باینری را از کاربر میگیریم اما در خط پنجم بجای اینکه مقدار را تبدیل به int کنیم به CharArray تبدیلش میکنیم و داخل متغیر temp ذخیره میکنیم. در خط هفتم یک متغییر از نوع int به نام value ایجاد میکنیم که مقدار دسیمال داخل آن ذخیره میشود. در خط هشتم یک متغیر به نام len هم داریم که از نوع عدد صحیح تعریف شده و مقدارش برابر است با طول آرایه temp یکی کمتر، اگر متوجه دلیل این کار نشدید جلوتر توضیح میدم.
در نهایت میریسم به حلقه foreach، این حلقه به ازای هر آیتمی که در temp وجود دارد یک بار کد خط ۱۱ را اجرا میکند و یکی هم از متغیر len کم میکند. اینجا کمی احتیاج به توضیح بیشتری دارد.
فرض کنید ما مقدار باینری ۱۰۱۰ را به برنامه میدهیم. چیزی که در متغییر temp ذخیره میشود این است:
'temp = {1}, {0}, {1}, {0}'
وقتی از سیشارپ میخواهیم طول temp را به ما برگرداند عدد ۴ را برمیگرداند در صورتی که اگر ارزش مکانی اولین عدد را صفر در نظر بگیریم ارزش مکانی آخرین عدد برابر با ۳ خواهد بود. به همین دلیل در خط هشتم ما متغییر len را برابر با temp.Length - 1 قرار دادیم.
دوباره برگردیم به حلقه foreach که به ازای هر آیتم داخل temp یک بار کد خط ۱۱ را اجرا میکند. اولین آیتم در temp برابر است با ۱، در واقع ما بجای اینکه از راست به چپ حرکت کنیم داریم از چپ به راست میرویم، پس همینطوری که در پاراگراف بالا توضیح دادم ارزش مکانی اولین آیتم برابر میشود با طول آرایه منهای یک.
در خط ۱۱ ما یک متغییر سه گانی تعریف کردیم، اگر مقدار آیتم برابر با یک باشد عدد دو را به توان ارزش مکانی در اینجا طول آرایه است میرساند و جواب را با مقدار متغیر value جمع میکند و اگر مقدار صفر باشد عدد صفر را برمیگرداند و از آنجایی که ما از چپ به راست حرکت میکنیم هر بار یکی از مقدار متغییر len هم کم میکنیم.
پینوشت: معمولا در زبانهای برنامهنویسی دو نوع حلقه داریم، حلقه for و حلقه while اما در زبان سیشارپ یک حلقه foreach هم داریم که مشخصا برای کار با آرایهها به کار میرود، یک حلقه do while هم داریم که توضیح آن خارج از بحث است.