View Full Version : تقسیم دو عدد باینری
mohammad-j
پنج شنبه 13 اردیبهشت 1386, 19:45 عصر
سلام بر دوستان گلم
کسی کدی داره که بشود دو عدد باینری مثل 1010 را بر 0010 تقسیم کرد و نتیجه باینری باشه ؟
magnalia
پنج شنبه 13 اردیبهشت 1386, 20:15 عصر
بهتره این دو عدد رو به مبنای 10ببری بعد از انجام تقسیم حاصل رو دوباره به مبنای 2 ببری
توسعه نویس
پنج شنبه 13 اردیبهشت 1386, 20:59 عصر
کد زیر بصورت کنسوله و از کلاسهای استاندارد 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
پنج شنبه 13 اردیبهشت 1386, 22:12 عصر
با عرض سلام خدمت کاربر توسعه نویس
اول از همه ممنون از برنامه خوبتون
البته من بوسیله دکمه تشکر از شما قدردانی کردم
یه سوالی داستم ممنون میشم اگر بتونین جوابم بدین
می خواستم کتاب یا ایبوکی در زمینه مبناها معرفی کنین
اگر هم سایتی رو معرفی کنین باز هم ممنون میشم
می خوام بطور کامل تبدیل مبناها رو یاد بده
مثلا مبنای 16 و 8 و ........ چطوری بهم تبدیل بشه و ..............
من دانشجوی ترم 2 کارشناسی نرم افزار هستم ولی متاسفانه هنوز اینها رو درست یاد نگرفتم
بازم تشکر می کنم
mohammad-j
پنج شنبه 13 اردیبهشت 1386, 22:59 عصر
ممنون ولی به هیچ عنوان نمیشه بدون بردن به مبنا 10 این کار و انجام داد ؟؟؟؟؟
توسعه نویس
شنبه 15 اردیبهشت 1386, 23:54 عصر
تا اونجا که من می دونم، ما 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/~rebelsky/Courses/CS152/97F/Readings/student-binary.html
دیگه فکم پیاده شد. اگه یه تازه نفس حال داشت از همون لینک مطلب رو اینجا کامل کنه.
taher_sa
یک شنبه 23 خرداد 1389, 02:17 صبح
سلام فکر کنم شما این مطالب رو نیاز داشتین. در ضمن منبع مطالب
http://daneshnameh.roshd.ir/mavara/mavara-index.php?page=%d8%b3%db%8c%d8%b3%d8%aa%d9%85+%d8% a7%d8%b9%d8%af%d8%a7%d8%af+%d8%af%d9%88+%d8%af%d9% 88%db%8c%db%8c&SSOReturnPage=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
سه شنبه 22 تیر 1389, 17:36 عصر
سلام 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();
}
//******************************************
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.