# Native Code > برنامه نویسی با C > برنامه نویسی با زبان C و ++C >  تقسیم دو عدد باینری

## mohammad-j

سلام بر دوستان گلم
کسی کدی داره که بشود دو عدد باینری مثل 1010 را بر 0010 تقسیم کرد و نتیجه باینری باشه ؟

----------


## magnalia

بهتره این دو عدد رو به مبنای 10ببری بعد از انجام تقسیم حاصل رو دوباره به مبنای 2 ببری

----------


## توسعه نویس

کد زیر بصورت کنسوله و از کلاسهای استاندارد C++‎ استفاده شده.


#include<iostream>
#include<string>
#include<bitset>
#include<limits>
usingnamespace std ;
 
int main()
{
string fstr,lstr;
unsignedint A,B,C;
registerint t; 
cout << "Enter First Binary Code:\n";
cin >> fstr;
cout << "Enter Second Binary Code:\n";
cin >> lstr; 
A = bitset<numeric_limits<unsignedlong>::digits>(fstr).to_ulong();
B = bitset<numeric_limits<unsignedlong>::digits>(lstr).to_ulong();
C = A/B;  
cout << "\n\n\n" << "resume is:\n"; 
for (t=128; t>0; t=t/2){
if(C & t) cout << '1';
else cout << '0';
} 
cout << "\n\n";
system ("pause");
return 0;
}

این کد اول دو مقدار به باینری میگیره بعدش بصورت دسیمال تبدیل میکنه و بعد از تقسیم نتیجه رو دوباره به باینری نمایش میده. :لبخند گشاده!:

----------


## mohammadkhan

با عرض سلام خدمت کاربر توسعه نویس
اول از همه ممنون از برنامه خوبتون
البته من بوسیله دکمه تشکر از شما قدردانی کردم
یه سوالی داستم ممنون میشم اگر بتونین جوابم بدین
می خواستم کتاب یا ایبوکی در زمینه مبناها معرفی کنین
اگر هم سایتی رو معرفی کنین باز هم ممنون میشم
می خوام بطور کامل تبدیل مبناها رو یاد بده
مثلا مبنای 16 و 8 و ........ چطوری بهم تبدیل بشه و ..............
من دانشجوی ترم 2 کارشناسی نرم افزار هستم ولی متاسفانه هنوز اینها رو درست یاد نگرفتم
بازم تشکر می کنم

----------


## mohammad-j

ممنون ولی به هیچ عنوان نمیشه بدون بردن به مبنا 10 این کار و انجام داد ؟؟؟؟؟

----------


## توسعه نویس

تا اونجا که من می دونم، ما 4 تا مبنا بیشتر نداریم که به ترتیب در پایین نوشتم:
باینری(دودویی) : {0،1} Binary
اکتادسیمال(هشت هشتی) : {0123456787} Octa
دسیمال(ده دهی) : {0123456789} Decimal
هگزادسیمال(شانزه تایی) : {0123456789ABCDEF}  Hex
البته دو حالت Accii و Ansi داریم که قضیش فرق میکنه.
در هگزا A=10 , B=11 , C=12 , D=13 , E=14 , F=15 میباشد.

برای تبدیل واحد ها به همدیگه یه فرمول ساده هست که به عنوان پیش نیاز لازمه بدونید:
به عدد 168 نگاه کنید : ما برای هر رقم یک جایگاه داریم. برای مثال در اینجا جایگاه 8 رو یکان ، جایگاه 6 رو دهگان ، جایگاه 1 رو صدگان میگیم. این جایگاه ها رو با یک فرمول عددی نشون میدن.
اینجاست که ما دست به دامن توانها میشیم. برای نشون دادن جایگاه ها ، اونا رو با توان که پایه اونها مبنا هست نشون میدیم. 
مثلا در سیستم دسیمال، یکان رو با (10^0) (ده به توان صفر) و یا دهگان رو با (10^1) و یا صدگان رو با 
(10^2) و الی آخر تا (10^n) نشون میدیم.

چرا اینجوریه، خوب خیلی ساده است. 
ده به توان صفر میشه عدد 1 یعنی یکان.
ده به توان یک میشه عدد 10 یعنی دهگان.
ده به توان دو میشه عدد 100 یعنی صدگان.
ده به توان سه میشه عدد 1000 یعنی هزارگان.
ده به توان چهار میشه عدد 10000 یعنی ده هزارگان.
و الی آخر .
به روبرو نگاه کنید، 8 6 1 و (10^0) (10^1) (10^2)

عبارت روبرو را نگاه کنید،  1*(10^2) + 6*(10^1) + 7*(10^0) = 168

اگر عددهای جداگانه رو مانند بالا در فرمول قرار دهیم عدد دسیمال محاسبه میشه.
خوب با توجه به استاندارد فرمول بالا فقط با تغییر مبنا ها میتونیم تمام عددهای در مبناهای دیگه رو به دسیمال(ده دهی) تبدیل کنیم. 
برای مثال تبدیل عدد (EB67A) از مبنای هگزادسیمال به دسیمال بصورت زیره: 
E=14 , B=11 , 6 , 7 , A=10
(14*16^4)+(11*16^3)+(6*16^2)+(7*16^1)+(10*16^0) = 
917504 + 45056 + 1536 + 112 + 10 = 964218

برای مثال تبدیل عدد از سیستم اوکتا به دسیمال برای عدد (170534) بصورت زیره: 
(1*8^5)+(7*8^4)+(0*8^3)+(5*8^2)+(3*8^1)+(4*8^0) =
32768 + 28672 + 0 + 320 + 24 + 4 = 61788

تبدیل عدد از سیستم باینری به دسیمال برای عدد (1001101011) بصورت زیره:

(1*2^9)+(0*2^8)+(0*2^7)+(1*2^6)+(1*2^5)+(0*2^4)+(1  *2^3)+(0*2^2)+(1*2^1)+(1*2^0) =
512 + 0 + 0 + 64 + 32 + 0 + 8 + 0 + 2 + 1 = 619 



برای کنترل صحت اعداد درآمده می تونید از ماشین حساب ویندوز استفاده کنید. از منوی view گزینه scientific رو باید فعال کنید.
اگر هم بلد نبودید میتونید بپرسید. 
خوب این سیستم تبدیل به دسیمال بود. برعکسش هم ممکنه. دیگه اونو یکم خودتون فکر کنید. اون برعکسه این فرمول هست. البته یه لینک میذارم برید حالت باینری اون رو ببنید. توی اون صفحه 2 الگوریتم برای تبدیل دسیمال به باینری مفصل توضیح داده شده. اگه فرمولش رو درک کنید می تونید برای مبناهای دیگه هم استفادش کنید(با کمی تغییر).
ضمنا در مورد جمع ، تفریق ، ضرب و تقسیم اعداد باینری هم مفصل توضیح داده شده. باید بگم این چهار عمل اصلی روی اعداد باینری دقیقا مانند سیستم ده دهی خودمون هست. 

این لینک مشکل گشا اینه :
http://www.math.grinnell.edu/~rebels...nt-binary.html 
دیگه فکم پیاده شد. اگه یه تازه نفس حال داشت از همون لینک مطلب رو اینجا کامل کنه.

----------


## taher_sa

سلام فکر کنم شما این مطالب رو نیاز داشتین. در ضمن منبع مطالب 
http://daneshnameh.roshd.ir/mavara/m...e=Check&Rand=0 هستش
*جمع* 


ساده ترین عملیات ریاضی در دودویی، جمع است. جمع زدن دو عدد تک رقمی دودویی نسبتاً ساده است:
0 + 0 = 0
0 + 1 = 1
1 + 1 = 10 (رقم یک منتقل می شود)  
هنگامی که نتیجه جمع از مقدار مبنا تجاوز می کند "عدد یک به سمت چپ منتقل" و به محل بعدی اضافه می شود. 
  1 1 1 1                         (منتتقل شده)
  0 1 1 0 1
      +      1 0 1 1 1 
     -------------------
      =   1 0 0 1 0 0 
شروع از ستون سمت راست، 1+1=10، رقم 1 به سمت چپ منتقل می شود و در پایین ستون 0 نوشته می شود. دومین ستون از سمت راست جمع زده می شود 1+1+0=10 دوباره 1 منتقل و 0 در پایین نوشته می شود ستون سوم، 1+1+1=11. این بار عدد 1 منتقل و درپایین ستون،1 نوشته می شود به همین صورت جواب 100100 به دست می آید.

*تفریق* 


در تفریق هم تا حد زیادی به همان صورت کار می کنند:
      0 – 0 = 0
      0 – 1 = 1 (قرض گرفته شده)           
      1 – 0 = 1
      1 – 1 = 0
          *    * * *        (از ستون های ستاره دار قرض گرفته شده است)
       1 1 0 1 1 1 0 
-    1 0 1 1 1
 -----------------
=  1 0 1 0 1 1 1
تفریق یک عدد مثبت از یک عدد دیگر مثل "جمع" منفی قدر مطلق آن با آن عدد است. کامپیوترها برای نمایش مقادیر منفی از مکمل عدد دو استفاده می کنند. برای جزئیات بیشتر مکمل عدد دو را ببیند.

*ضرب* 

دو عدد "A" و "B" را با ضرب جزئی (partial) می توان در هم ضرب کرد برای هر رقم "B" حاصل ضرب آن را در عدد "A" به دست آورده و بر روی خطی جدید زیر رقم ضرب شده از "B" بنویسید. در آخر مجموع تمام ضرب های جرئی را محاسبه کنید. 

برای مثال دو عدد 1010 و 1011 به صورت زیر در هم ضرب می شوند:*} 
          1 0 1 1        (A) 
        * 1 0 10         (B) 
        ---------- 
          0 0 0 0         B  به خاطر رقم صفر عدد  
               1 0 1 1             B  به خاطر رقم یک عدد 
            0 0 0 0  
      + 1 0 1 1 
      ------------------ 
      = 1 1 0 1 1 1 0 
*تقسیم* 


تقسیم در مبنای دو نیز همانند تقسیم ده دهی است.
در اینجا مقسوم علیه 1012 یا عدد5  است.
1 1 0 1 1     1 0 1 
1 0 1           1 0 1
    --------
  0 1 1
  0 0 0
    ---------
    1 1 1
    1 0 1
  --------
    0 1
همانند ضرب های طولانی ده دهی سه رقم از مقسوم جدا و آن را بر مقسوم علیه تقسیم می کنیم بنابراین در خارج قسمت عدد1 را می نویسیم عدد یک از مقسوم علیه ضرب و حاصل از سه رقم جدا شده کم می شود. رقم بعدی "1" اضافه می شود. این کار ادامه پیدا می کند تا جایی که رقم های مقسوم تمام شود.
بنابراین خارج قسمت تقسیم 11011  بر 101  برابر 1012  و باقی مانده  102 است.

----------


## Shiva.K

سلام mohammad-j,
کد جمع دو عدد باینری رو برات گذاشتم چون توش هم تبدیل مبنای 2 به 10 داره هم الگوریتمشون در صورت بخشپذیر بودن اعداد یعنی وقتی جواب اعشاری نیست یکیه.
امیدوارم به دردت بخوره

 //****************************************

 void sum_of_binary()
 {
    int n1,n2,i=0,k=0,r1,r2,r3,s1=0,s2=0,sum;
    cout<<"Enter binary number 1:";
    cin>>n1;
     do{
        r1=n1%10;
        s1+=r1*pow(2,i);
        n1=n1/10;
        i++;}while(n1>0);
        cout<<"Enter binary number 2:";
        cin>>n2;

        do{
        r2=n2%10;
        s2+=r2*pow(2,k);
        n2=n2/10;
        k++;
      }while(n2>0);

        sum=s1+s2;
        int j=0,a[20];
        while(sum>=1)//or while(sum>0)
        {
            r3=sum%2;
            a[j]=r3;
            sum/=2;
            j++;
        }
     cout<<"The sum of tow binary number is:";
    for(j--;j>=sum;--j) //for(--j or j--;j>=0;j--)
        cout<<a[j];
        cout<<"\nIf you want to go back to the menu press enter.";
    if(getch()=='\r')
        menu();
}
//******************************************

----------

