دو نیم کردن (الگوریتم کامپیوتری)

در ریاضیات ، **تقسیم بر [[۲ (عدد)|دو]]** یا **دو نیم کردن**، **میانجی گری** یا **کاهش** نیز نامیده می‌شود**.**  سابقه برخورد با آن به عنوان یک عملیات مجزا از ضرب و تقسیم معمولی بر سایر اعداد به مصر باستان برمی‌گردد که الگوریتم ضرب آنها از تقسیم بر دو به عنوان یکی از مراحل اصلی استفاده می کرد. برخی ریاضیدانان تا اواخر قرن شانزدهم همچنان نیم‌کردن را به عنوان یک عملیات ریاضی جداگانه به حساب می‌آوردند،  همچنین در برنامه‌نویسی کامپیوتری مدرن نیز اغلب به صورت جدا مورد تحلیل و بررسی قرار می گیرد. انجام این عملیات در محاسبات ده‌دهی، سیستم اعداد دودویی که در برنامه‌نویسی کامپیوتری کاربرد دارد و نیز در سایر سیستم‌های اعداد با مبنای زوج آسان است.

## دودویی
در محاسبات دودویی، تقسیم بر دو را می توان با یک عملیات شیفت بیتی انجام داد که مکان شماره را یک واحد به سمت راست منتقل می کند. این عمل شکلی از بهینه سازی کاهش قدرت است. به عنوان مثال، 1101001 به صورت دودویی (عدد مبنای ده: 105)، پس از یک واحد انتقال به سمت راست، برابر با 110100 می‌شود (عدد مبنای ده: 52)؛ توجه شود که کم‌ارزش‌ترین بیت، یعنی 1، حذف می‌شود. به‌طور مشابه، تقسیم بر هر توان دو 2*k* را می توان با جابجایی (شیفت) به تعداد *k واحد به سمت* راست انجام داد. از آنجا که تغییر بیت اغلب عملیاتی بسیار سریعتر از عملیات تقسیم است، جایگزینی یک تقسیم با یک شیفت به این روش می تواند گام مفیدی در بهینه سازی برنامه باشد. با این حال، به خاطر قابل حمل بودن نرم‌افزار و خوانایی آن، در بیشتر موارد بهتر است برنامه ها با استفاده از عملیات تقسیم نوشته شود و اعتماد به کامپایلر برای انجام این جایگزینی صورت گیرد. مثالی از لیسپ:
```lisp
(setq number #b1101001)   ; #b1101001  —  105
 (ash number -1)           ; #b0110100  —  105 >> 1 ⇒ 52
 (ash number -4)           ; #b0000110  —  105 >> 4 ≡ 105 / 2⁴ ⇒ 6
```
با این حال، دستورها بالا لزوما در مورد تقسیم اعداد دودویی علامت‌دار درست نیستند. در شیفت دادن یک واحدی به سمت راست که باعث تقسیم بر دو می شود، عدد همواره به سمت پایین گرد می‌شود. با این حال، در برخی از زبان‌های برنامه‌نویسی، تقسیم اعداد دودویی علامت‌دار به سمت 0 گرد می شود (که اگر حاصل عملیات منفی باشد، به این معنی است که به سمت بالا گرد شده است). به عنوان مثال، جاوا یکی از این زبان‌ها است: در جاوا، -3/2 معادل با -1 ارزیابی می‌شود، در حالی که -3 >> 1 معادل -2 می‌شود. بنابراین زمانی که مقسوم منفی باشد، احتمالاً کامپایلر *نمی‌تواند* با جایگزین کردن تقسیم بر دو با شیفت بیتی آن را بهینه کند.

## ممیز شناور دودویی
در محاسبات ممیز شناور دودویی، تقسیم بر دو را می توان با یک واحد کاهش توان انجام داد (تا زمانی که نتیجه یک عدد غیرعادی نباشد). بسیاری از زبان های برنامه نویسی دارای توابعی هستند که می توان از آنها برای تقسیم یک عدد ممیز شناور بر توانی از دو استفاده کرد. برای مثال زبان برنامه‌نویسی جاوا مِتُد `java.lang.Math.scalb` را برای مقیاس‌بندی با توان دو ارائه می‌کند، و در زبان برنامه نویسی C تابع `ldexp` به همین منظور وجود دارد.

## ده‌دهی
الگوریتم زیر برای اعداد ده‌دهی می‌باشد. اما می توان آن را به عنوان یک مدل برای ساخت الگوریتمی برای به دست آوردن نیمی از هر عدد *N* در هر مبنای زوجی به کار برد.

* *N* را نوشته و یک صفر در سمت چپ آن قرار دهید.
* *ارقام N را* به صورت زوج‌های متداخل در نظر بگیرید، سپس ارقام حاصل را از جدول زیر یادداشت کنید.

مثال: 1738/2=?

01738 را می‌نویسیم و برای پیدا کردن پاسخ به صورت زیر عمل می‌کنیم.

* 01: رقم اول زوج و رقم دوم 1، 0 می‌نویسیم.
* 17: رقم اول فرد و رقم دوم 7، 8 می‌نویسیم.
* 73: رقم اول فرد و رقم دوم 3، 6 می‌نویسیم.
* 38: رقم اول فرد و رقم دوم 8، 9 می‌نویسیم.

حاصل: 0869.

از مثال می‌توان فهمید که 0 زوج است.

اگر رقم آخر عدد *N* فرد باشد باید 0.5 به حاصل اضافه کنیم.

## همچنین ببینید

* نیم
* میانه، عددی است که یک جمعیت آماری یا یک توزیع احتمالی را به دو قسمت مساوی تقسیم می‌کند.
* نیمساز، تقسیم یک شی هندسی به دو نیمه مساوی
* دیمیدیشن، روشی در نشان‌شناسی برای به هم پیوستن دو نشان از طریق تقسیم طرح‌های آن‌ها به دو نیم

## منابع

رده:۲ (عدد)
رده:اعداد زوج و فرد
رده:محاسبه اعداد دودویی
رده:چهار عمل اصلی
رده:تقسیم