سلام سلام سلام! الان که دارم این وبلاگ رو مینویسم، پاسی از شبه و من مثل همیشه موقع خواب به این فکر کردم که چطور اعداد رو با استفاده از زبان برنامه نویسی از سیستم دسیمال(اعداد معمولی ای که در روزمره با اون سروکار داریم مثل عدد 18) به سیستم باینری ( که همون زبان صفر و یک کامپیوتر هست) ببرم!
خب من این کارو با پایتون قبلا انجام دادم ولی میخواستم اونو با زبان جدیدی که کار میکنم( سی شارپ) انجام بدم!
اول از همه باید مسئله رو بخوبی درک کنیم.
گام اول: می دانم که نمیدانم!
خب خوبه که نمیدونی همه چی از همین ندونستن شروع شد!
اول بیا ببینیم چطور اصلا میشه اعداد رو بدون برنامه نویسی از دسیمال به باینری برد!
اقاااااا حوصله تایپشو ندارم ولی ویدیوشو قبلا اماده کردم این زیر برات میزارم، دوست داشتی ببین! اگه هم اینو بلدی که بیا بریم ادامش!
خب امیدوارم بعد دیدن این ویدیو 2 هزاریت افتاده باشه! خب حالا بریم سراغ کد برنامه نویسیش در پایتون ( بقول یکی از استادامون فایتون!)
x = int(input("enter:")) z = [] while x > 0: z.append(x%2) x = x // 2 for j in z: print(j,end="")
خب اول که داریم از کاربر یه عدد دریافت میکنیم تا اینجا که چیزی نداره! حالا یه لیست میسازیم که اعداد باینری به ترتیب در این لیست قرار داده بشن و بعد بتونیم خروجی لیست رو چاپ کنیم.
یه حلقه هم میزنیم تنگش با شرط اینکه اعداد زیر 0 نباشن که باینری نداشته باشن! حالا میایم باقی مونده عدد کاربر بر 2 رو وارد لیستی که ساختیم میکنیم. اینو یادت نره که باقی مونده تموم اعداد بر 2 یا 0 هستن یا 1. اگر بخش پذیر باشه 0 و اگر نباشه 1 هست. خب حالا اعداد کاربر رو بر 2 تقسیم میکنیم. فرق x / 2 و x // 2 اینه که اولی حاصل دقیقی داره ولی دومی به پایین رند میشه. در بار اول اجرای حلقه مثلا فرض کنیم عدد مد نظر کاربر 18 هست. باقی مونده 18 بر 2 عدد 0 هست. واضحه دیگه 18 بر 2 بخش پذیره! و این عدد میره در لیست z ما قرار میگیره. بعد 18 ما بر 2 تقسیم میشه و حاصل عدد 9 هست. حال دوباره همین عدد باقی موندش بر 2 حساب میشه که چون بخش پذیر نیست؛ حاصل چی میشه؟ آفرین دقیقا 1 میشه.
حالا این 9 دوباره بر 2 تقسیم میشه که حاصل عدد 4.5 هست ولی چون به پایین رند میشه، همون 4 درنظر گرفته میشه و دوباره باقی مونده این عدد حساب میشه.(چون بخش پذیره پس حاصل 0 میشه و در لیست z قرار میگیره) دوباره 4 تقسیم بر 2 میشه و حاصل 2 و دوباره باقی موندش که 0 هست میره تو لیست z. عدد بعدی چیه؟ افرین تقسیم بر تو میشه 1 و چون باقی موندش بر تو بخش پذیر نیست، عدد 1 میره تو لیست. بعدم در نهایت میرسیم به عدد 1 تقسیم بر 2 که حاصل میشه 0.5 و به پایین رند میشه یعنی عدد 0 و شرط while تموم میشه و با حلقه for تک تک ایندکس های لیست z رو پشت سر هم چاپ میکنیم که حاصل میشه: 01001
گام 2 دوم ، اگه فهمیدی تبدیل کن!
حالا باید دقیقا همین فرمون رو با سی شارپ بریم جلو که داریم:
static void Main(string[] args) { Console.WriteLine("enter number:"); int x = int.Parse(Console.ReadLine()); List<int> z = new List<int>(); while (x > 0) { z.Add(x % 2); x = x / 2; } foreach (int i in z) { Console.Write(i); } }
دیدی سخت نبود؟ فقط باید بفهمیش! پیشنهاد میدم یه بار رو کاغذ بنویسیش و بعدش کدو کپی کن و با حالت debug mode اجرا کنی تا خط به خط متوجه منظورم بشی! سوالی هم بود از طریق صفحه من یا دیدگاه ها ازم بپرس ،ازم بپرس! صفحه من
تو ویدیو زیر خط به خط رو با حالت دیباگ اجرا کردم تا درک نوشته هام راحت تر بشه: