برنامه نویسی

نمایش اعداد منفی در نمادگذاری باینری

ما دیدیم که چگونه دو عدد صحیح مثبت را در نماد دودویی به هم اضافه کنیم. اما وقتی می خواهیم تفریق کنیم چه اتفاقی می افتد؟

 0110
-0011
------
010(-1)???
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خیلی سریع خواهید دید که نمی‌توانیم 1 را از 0 در هر ستون معین کم کنیم، بنابراین به روشی متفاوت برای انجام عملیات تفریق در نماد دودویی نیاز داریم. از نظر فنی 3 روش مختلف وجود دارد که اعداد منفی را می توان به صورت دودویی نشان داد. رایج ترین نامیده می شود مکمل دو. اما قبل از رسیدن به آن، دو روش دیگر وجود دارد که باید در مورد آن بدانیم…

1. قدر امضا شده

در مبنا 10، می توانیم مثبت یا منفی بودن یک عدد را با اضافه کردن علامت مربوطه در سمت چپ عدد، مانند 50+ و 45- نشان دهیم. اما ما راهی برای نمایش مستقیم علامت به صورت باینری نداریم، فقط بیت هایی داریم که باید با آنها کار کنیم. Signed به معنای افزودن علامت (+ یا -) به عدد است و Magnitude اصطلاحی است که به مقدار واقعی عدد اشاره دارد. بنابراین در عدد -65، ‘-‘ است امضا کردنو 65 است اندازه از تعداد

اعداد باینری می توانند باشند امضاء شده یا بدون امضا. در یک عدد علامت دار، بیشترین بیت سمت چپ برای نشان دادن علامت مثبت یا منفی رزرو می شود. 0 در این ستون نشان دهنده علامت مثبت (+) و 1 نشان دهنده علامت منفی (-) است. در حالت بدون علامت، بیت سمت چپ به سادگی عدد موجود در آن ستون را نشان می دهد. اعداد بدون علامت فقط می توانند اعداد مثبت و صفر را نشان دهند. قدر علامت به ما امکان می دهد اعداد منفی را به صورت دودویی نمایش دهیم، بنابراین این چیزی است که در ادامه این پست استفاده خواهیم کرد.

10000001 = (-)1 signed
10000001 = 129 unsigned
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

MSB و LSB

ما دیده‌ایم که چگونه می‌توان سمت چپ‌ترین بیت یک عدد باینری را برای نشان دادن علامت مثبت یا منفی رزرو کرد. اصطلاحات واقعی وجود دارد که این موقعیت را توصیف می کند: مهم ترین بیت (یا MSB به طور خلاصه) بیشترین بیت سمت چپ را در یک عدد باینری توصیف می کند. این برای توصیف بیت علامت دار یک عدد باینری امضا شده مفید است. این کم اهمیت ترین جزء (یا LSB) سمت راست ترین بیت را در یک عدد، موقعیت ones را توصیف می کند. هنگامی که بیشتر با اعداد باینری کار می کنید، اغلب با این اصطلاحات روبرو خواهید شد.

2. مکمل یکی

ممکن است بتوانیم یک علامت را نشان دهیم، اما هنوز قادر به انجام عمل تفریق واقعی نیستیم. برای انجام این کار به صورت باینری، باید تفکر خود را کمی تغییر دهیم. به جای کم کردن یک عدد، یک عدد منفی به مثبت اضافه می کنیم. در باینری این نیاز به مقداری تبدیل subtrahend (عدد در حال تفریق) دارد تا کار کند.

مکمل یکی به سادگی به این معنی است که تمام بیت های یک عدد را بردارید و آنها را برگردانید. اگر بیت 0 بود، آن را 1 و اگر 1 بود، آن را 0 کنید.

0011 = 3
1100 = one's complement of 3
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون می توانیم از مکمل این یکی به عنوان مقداری که به عدد اولیه خود اضافه می کنیم استفاده کنیم. فرض کنید می خواهیم 3 را از 7 کم کنیم. می دانیم که مکمل 3 در باینری 1100 است. بنابراین این را به نمایش دودویی 7 که 0111 است اضافه می کنیم.

  0111 = 7
+ 1100 = one's complement of 3
-------
 10011 = 3?

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

می بینید که ما یک پاسخ صحیح که 4 است، کم داریم و نتیجه ما در حال حاضر منفی است. در محاسبات مکمل One، اگر بیت انتقالی در MSB وجود داشته باشد، با گرفتن MSB و افزودن آن به LSB، انتقال را انجام می دهیم. این پاسخ صحیح را به ما می دهد که 0100 = 4 است.

توجه به این نکته مهم است که مکمل یک عدد، منفی آن عدد نیست. برای مثال متمم 3 عدد 1100 است که در باینری در واقع عدد 4+ را نشان می دهد. مکمل دقیقاً همین است، یک مقدار مکمل که وقتی به minuend ما اضافه می‌شود (تعدادی که باید از آن کسر شود) این تأثیر را دارد که نتیجه صحیح یک عمل تفریق را به ما بدهد.

مکمل یکی روشی برای تفریق است که این روزها به ندرت در رایانه های واقعی استفاده می شود، معمولاً در سیستم های قدیمی تر استفاده می شود. یک کاستی دارد و آن این است که دو نمایش متفاوت برای صفر دارد، مثبت و منفی صفر.

0000 = (+)zero
1111 = (-)zero (One's Complement of +zero)

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

درعوض، بیشتر دیده می شود…

3. مکمل دو

مکمل دو فقط مکمل یک به اضافه یک است! تنها تفاوت این است که به جای جمع کردن 1 بعد از محاسبه، در مکمل Two، قبل از محاسبه مجموع، 1 را به مکمل خود اضافه می کنیم. این رایج ترین شکلی است که یک مکمل در سیستم های باینری به خود می گیرد.

بیایید 10 را از 23 در باینری کم کنیم. ابتدا باید عددی که باید تفریق شود را به مکمل دو تبدیل کنیم:

00001010 = 10 in binary

11110101 = One's Complement of 10

11110110 = Two's Complement of 10
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ابتدا مکمل One’s 10 را با ورق زدن هر بیت در عدد می گیریم، سپس 1 را به LSB اضافه می کنیم تا مکمل Two خود را بدست آوریم. اکنون ما برای عملیات تفریق خود آماده هستیم.

 00010111 = 23
+11110110 = 10
----------
100001101 = 13    
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

از آنجایی که یک مورد را قبل از عملیات اضافه می کنیم، نتیجه عدد صحیح است! در Two’s Complement، اگر محاسبات ما یک بار در MSB داشته باشد، می‌توانیم آن را کوتاه کنیم. نتیجه نهایی ما 13 است.

https://www.youtube.com/watch?v=H67AoPcvcfA

نتیجه

ما دیدیم که چگونه از مکمل Two برای اجرای عملیات تفریق روی دو عدد باینری استفاده کنیم. در پست بعدی با عملگرهای Bitwise آشنا می‌شویم، که مجموعه‌ای از عملیات هستند که به ما انعطاف‌پذیری بیشتر و دستکاری بیشتر اعداد باینری را می‌دهند!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا