تبدیل اعداد منفی به باینری
قبل از توضیح این مطلب به قوانین جمع باینری اعداد توجه کنید:
0 + 0 = 0 1 + 0 = 1 0 + 1 = 1 1 + 1 = 10 1 + 1 + 1 = 11
اما چرا 1 + 1 در ریاضی 2 و 1 + 1 + 1 برابر 3 ولی در سیستم باینری 10 و 11 می شوند؟ به شکل زیر توجه کنید:
در اصل 1 + 1 همان 2 می شود که در سیستم باینری همین عدد بر 2 تقسیم می شود و اعداد 0 و 1 تولید می شوند و همین در مورد 1 + 1 + 1 نیز صدق می کند. با تقسیم عدد 3 بر 2 اعداد 1 و 1 تولید می شوند. به عدد تولید شده در خارج قسمت رقم نقلی می گویند که در ادامه درس کاربرد آن را متوجه می شوید. برای درک بهتر قوانین بالا به مثال زیر توجه کنید:
110 + 111 ------- 1101
برای جمع دو عدد باینری کافی است بیت به بیت از سمت راست به چپ عمل جمع انجام شود. رقم نقلی حاصل از هر ستون در جمع ستون بعدی اعمال می شود. در کد بالا، از سمت راست به چپ، 0+1 که 1 می شود و آن را می نویسیم. 1+1 هم چون 10 می شود، عدد 0 را نوشته و 1 را به ستون بعد منتقل می کنیم. در ستون سوم از بالا به پایین 1+1 عدد 10 می شود که با 1 جمع کرده و عدد 11 را می نویسیم. به شکل زیر توجه کنید:
تبدیل اعداد منفی به باینری
تبدیل اعداد منفی به باینری راحت نیست و کمی گیج کننده است. سی شارپ و دات نت از روش مکمل 2 (Two’s Complement Notation) برای این تبدیل استفاده می کنند. برای درک تبدیل اعداد منفی به باینری اجازه دهید که یک مثال بزنیم. در این مثال می خواهیم عدد 5- را به معادل باینری آن تبدیل کنیم. در مرحله اول ابتدا عدد 5- را به 5+ و سپس این عدد مثبت را به معادل باینری آن تبدیل می کنیم :
5 = 00000101
مقدار 5+ برابر 101 در سیستم دودویی است پس بقیه بیت های سمت چپ با عدد صفر پر شده اند. بعد از این تبدیل با استفاده از عملگر بیتی NOT ( ~ ) بیت ها را برعکس می کنیم :
~5 = 11111010
بعد از انجام این کار مقدار باینری 5~ را با عدد 1 به صورت زیر جمع می کنیم :
11111010 + 00000001 ----------- 11111011
نتیجه این جمع عدد 5- است. در نگاه اول ممکن است این سوال برایتان پیش بیاید که واقعا حاصل جمع بالا عدد 5- است؟ همانطور که گفتیم این تبدیل کمی گیج کننده است. اگر نتیجه بالا را با استفاده از تکنیک هایی که یاد گرفته اید به معادل دسیمال آن تبدیل کنید رقم 251 را به دست می آورید. اما سی شارپ و دات نت از اولین بیت سمت چپ برای تشخیص مثبت یا منفی بودن عدد استفاده می کند. اگر این بیت 1 باشد عدد منفی و اگر صفر باشد عدد مثبت است. پس باید به صورت زیر عمل جمع را انجام دهید :
به مثال دیگر توجه کنید. می خواهیم معادل باینری عدد 6- را به دست آوریم. ابتدا عدد 6 را به معادل باینری تبدیل می کنیم:
00000110
سپس بیت ها را معکوس می کنیم:
11111001
و در آخر با استفاده از قوانین جمع باینری که در ابتدای درس توضیح دادیم 6~ را با عدد 1 به صورت باینری جمع می کنیم:
11111001 + 00000001 ----------- 11111010
سپس نتیجه جمع بالا را، به عدد دسیمال تبدیل می کنیم. به شکل زیر توجه کنید:
حال اگر 6- را با 6 جمع کنیم حاصل 0 می شود :
00000110 + 11111010 ----------- 00000000
کد بالا را با استفاده از قوانینی که در ابتدای درس توضیح دادیم، با هم جمع کرده ایم. برای درک بهتر به شکل زیر توجه کنید:
نکته ای که در شکل بالا وجود دارد حاصل جمع اولین ستون سمت چپ است که باید عدد 10 باشد.از آنجایی که سیستم باینری باید با 8 بیت کار کند، تنها 8 رقم نخست برای ارائه پاسخ کافی خواهد بود و بیت آخر (بیت 9) را نادیده میگیریم. این بیت به نام بیت Overflow نامیده میشود. Overflow زمانی رخ میدهد که مجموع ستون سمت چپ، یک رقم اضافی تولید کند. این بیت اضافی Overflow را، میتوان به طور کامل نادیده گرفت
با سلام.دوستانی که میفرمایند این تبدیلات به کار نمی ایند خدمتشون عارض باشم که برنامه نویسی تنها جاوا و سی نمیباشد بسیاری از برنامه نویسانی که در حوضه امنیت سایبری و یا برنامه نویسی به زیان اسمبلی کار میکنند که اشنایی با خود این زبان در برخی از کارهای امنیتی نیز به کار میاد به شدت با این تبدیلات سروکار دارند…مثلا برای اشنایی با واحد حافظه یا پروسسورهایی مانند پنتیوم یا موتورولا و البته نحوه کار وتعاملشون با حافظه رم که از واجبات برنامه نویسی اسمبلی میباشد مستلزم اشنایی با همچین تبدیلاتی میباشد.با تشکر
توضیحاتتان عالی بود، ولی آیا از نظر ریاضی هم از همین عملیات استفاده می شود یا فقط در برنامه نویسی کاربرد دارد؟ اگر جواب منفی است راه حلی برای این کار در ریاضیات وجود دارد؟
مرسی…
به طور کلي سه روش براي نمايش اعداد منفي در مبناي 2 وجود دارد. اين روش ها عبارتند از نمايش sign – magnitude، مکمل 1 و مکمل 2
نمايش sign-magnitude: در اين نمايش براي منفي کردن يک عدد تنها بيت علامت يک مي شود. مثلا با فرض داشتن 4 بيت براي نمايش عدد 0011 عدد 3 است و 1011 عدد 3-
نمايش مکمل 1: در اين نمايش براي منفي کردن عدد بيت هاي آن را مکمل مي کنيم. مثلا با فرض داشتن 4 بيت، 3- برابر 1100 مي شود.
نمايش مکمل 2: برابر مکمل 1 به علاوه 1 است. مثلا 3- در اين نمايش برابر با 1100+1=1101 خواهد بود. براي مکمل 2 کردن مي توان از روش زير استفاده کرد:
عدد مثبت را در نظر بگير.
از سمت راست بيت ها را بررسي کن. تا زماني که به بيت برابر يک نرسيده اي کاري انجام نده.
براي اولين يک هم کاري انجام نده و جلو برو.
بقيه بيت ها را مکمل کن.
مثال: با فرض داشتن 6 بيت براي نمايش عدد مطلوبست نمايش مکمل 2 براي عدد 12-
مثال: با فرض استفاده از نمايش 8 بيتي مطلوبست نمايش 19- به روش هاي سه گانه نمايش عدد منفي
عاااالی
دستتون درد نکنه
مرسی
با سلام
من تازه برنامه نویسی رو شروع کردم
اون دوستامون بالا نوشته که این چیزها بعدا استفاده ای نداره در برنامه نویسی حرفه ای
لطفا نفرمایید که اینها رو باید حتما حتما یاد بگیریم یا واقعا لازم نیست
عملگر های بیتی رو یاد بگیریم
چون واقعا سخته جساب کنی که چه جوری میشه پنج میشه منفی پنج
لطفا راهنمایی بفرمائید .
سلام دوست عزیز
لازم نیست این نوع تبدیل ها رو بلد باشین، چون تو برنامه نویسی شاید یک بار هم به کارتون نیاد
توضیحات کامل، مفهوم و عالی بودن.
واقعا متشکرم.
خیلی لطف دارین
مرسی
اینا رو تا حدودی میدونم من خودم چند وقته برنامه نویسی میکنم این عملگرها رو هم میشناسم ولی هیچ وقت نشد من مثلا بگن اقا برو فلان برنامه رو بنویس این عمگرا هم توش کاربرد دارن
مثلا ادم میره برنامه نویسی شی گرا یاد میگیره خوب همه جا به کار میاد و …
ولی اینا به نظرم بیشتر واسه اینکه بیشتر بدونی خوبه نه اینکه بخوای باهاشون کار کنی
دقیقا همینطوره که می فرمایید
مرسی خوب بود مخصوصا اون عکس پایین که همه چیزو میگه
در کل این جور چیزا کجا به کار آدم میاد
اصلا کاربردش واسه چه برنامه نویساییه؟
لطف دارین
مطلب زیر رو بخونید
http://www.w3-farsi.com/%d8%b9%d9%85%d9%84%da%af%d8%b1%d9%87%d8%a7%db%8c-%d8%a8%db%8c%d8%aa%db%8c-%d8%af%d8%b1-%d8%b3%db%8c-%d8%b4%d8%a7%d8%b1%d9%be/
ممنون. واقعا به درد خورد. من چون سیستمهای embedded رو شروع به خوندن کردم گاهی احتیاج به توضیح دارم. مرسی
خواهش می کنم
ممنون از توضيحات عالي و واضح شما
لطف دارین
توضیحات بسیار شفاف و واضح بودند.
تشکر.