كما هو واضح من السؤال المطلوب هو داله تحسب عدد البتات bits التى يستهلكها متغير int
فعلى سبيل المثال الرقم 5 يستهلك 3 بت و الرقم 16 يستهلك 5 بت :resentful:
**********************
أضاقه على الداله : اجعلها تتعامل مع الأرقام السالبه و الموجبه :D
كما هو واضح من السؤال المطلوب هو داله تحسب عدد البتات bits التى يستهلكها متغير int
فعلى سبيل المثال الرقم 5 يستهلك 3 بت و الرقم 16 يستهلك 5 بت :resentful:
**********************
أضاقه على الداله : اجعلها تتعامل مع الأرقام السالبه و الموجبه :D
مدونتي: C++ Tips and Tricks
هل السؤال صعب لهذه الدرجه ؟؟
تم تعديل هذه المشاركة بواسطة Game Expert في 29 مايو 2009 في 22:15
مدونتي: C++ Tips and Tricks
السلام عليكم
اللى أعرفه ان اى متغير من النوع int يتم حجز 4 بايتات له اى 32 بت
وطريقة تخزين العدد الصحيح
هى كالآتى
فرضنا مثلا العدد 600
يتم قسمة العدد 600 على العدد 256 وايجاد باقى القسمه وصحيح القسمه
يتم تخزين صحيح القسمه فى البايت الأول وباقى القسمه فى البايت الثانى والثالث والرابع أصفار
فيتم تخزين 600 بالشكل اللآتى
88 2 0 0
أقصد أن 32 بت تملأ
أخى
جرب الكود التالى
#include <iostream.h>
int main()
{
int n;
unsigned char* p;
while (1)
{
cout<<"Enter number : ";
cin>>n;
p=(unsigned char*)&n;
cout<<int(*(p+3))<<" "<<int(*(p+2))<<" "<<int(*(p+1))<<" "<<int(*(p))<<endl;
}
}أم أنت تقصد تحويل العدد الى ثنائى ينتج كم خانه؟
سلام
اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم
هو يقصد ان عدد مثل 5 مثلا يتم تمثيله ثنائيا هكذا :
101
اذا يأخذ 3 بت
عدد مثل 664 :
1010011000
اذا يأخذ 10 بت
وهكذا ...
mov eax, dword ptr ds:[0xffdf0308]
jmp dword ptr [eax+0xfc]
السلام عليكم
دا برنامج للأعداد الموجبه
#include <iostream.h>
int num_bits(int n)
{
int c=0;
while (n>0)
{
c++;
n=n/2;
}
return c;
}
int main()
{
int n;
while (1)
{
cout<<"Enter number : ";
cin>>n;
cout<<"number of bits : "<<num_bits(n)<<endl;
}
return 0;
}اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم
ده مجرد اختبار يجماعه للتسليه مش اكتر و كنت عايز اشوف طريقة كل واحد
و على العموم طريقتى اهى اتمنى انها متكنش سيئه
#include <iostream>using namespace std;short occuped(int);const int MAX_INT = sizeof(int) * 8;void main(){ cout << occuped(8) << endl;}short occuped(int num){ short res=0; num = num<0? num * -1: num; unsigned int max = 0x80000000; // 1000 0000 0000 0000 for (int c=0; c < MAX_INT; c++) if ((num & (max >> c)) != 0) { res=MAX_INT - c; break; } return res;}اه نسيت الداله occuped بتتعامل مع الأرقام السالبه و الموجبه
تم تعديل هذه المشاركة بواسطة C++er في 25 نوفمبر 2013 في 22:12
مدونتي: C++ Tips and Tricks
السلام عليكم ....
سؤال جميل :)
و هذا حلي ::
int occupied(int number){
int comparator = 0x80000000, bits = 32;
while(!(number & comparator))
{
bits--;
comparator >>= 1;
}
return bits;
}ملاحظة فقط, الأعداد السالبة ليس لها تمثيل موحد, و طريقتك تحسب عدد الـ bits اللازمة للقيمة المطلقة للعدد السالب و ليس للعدد السالب نفسه :)
لو كان two complements, فإن عدد الـ bits في حالة كونه int سيكون 32 bits, و الأعداد السالبة حسب التمثيل المذكور, تحتاج إلى كامل حجم المتغير لتمثيله, سواء كان العدد 1- أو أصغر من ذلك, فهذا لا يؤثر على الحجم المطلوب..
سؤال رائع :)
تحياتي ..
تحياتي ...
تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 30 مايو 2009 في 01:55
رائع اخى خالد
دالتك افضل كثيرا من الداله التى صنعتها
و لكن لى سؤال
اقتباسالأعداد السالبة ليس لها تمثيل موحد
للحصول على العدد السالب نقوم بعكس كل البتات للرقم الموجب لهذا العدد ثم نضيف واحد بت. هذه الطريقه الوحيده لتمثيل الأعداد السالبه التى اعرفها فهل توجد طرق أخرى؟
اقتباسطريقتك تحسب عدد الـ bits اللازمة للقيمة المطلقة للعدد السالب و ليس للعدد السالب نفسه
كلامك صحيح تماما، و لكن كيف يمكن معرفة عدد البتات التى يحجزها الرقم السالب إن لم نعرف عدد البتات الخاصه بالرقم الموجب لهذا العدد. لإن العدد السالب كل البتات الخاصه به تكون معكوسه و بالتالى فإن البتات الأخيره منه تكون واحد، ياريت توضح لى النقطه دى لو تقدر علشان انا مش مستوعبها بشكل جيد.
و جزاك الله خيرا
تم تعديل هذه المشاركة بواسطة Game Expert في 30 مايو 2009 في 02:15
مدونتي: C++ Tips and Tricks
اقتباسدالتك افضل كثيرا من الداله التى صنعتها
كل الطرق تؤدي إلى روما :)
اقتباسللحصول على العدد السالب نقوم بعكس كل البتات للرقم الموجب لهذا العدد ثم نضيف واحد بت. هذه الطريقه الوحيده لتمثيل الأعداد السالبه التى اعرفها فهل توجد طرق أخرى؟
هذه طريقة, و ليست حقيقة علمية :lol:, الحقيقية أن معظم من يبدأ المشوار لا يفكر بطريقتك على العكس يفكر أن هناك bit يمثل العلامة... صح ؟
بمعنى أن آخر أو أول bit هو يمثل العدد هل هو سالب أو موجب.... و هذه الطريقة لها سلبيات أكثر من الإيجابيات عندما نتحدث عن الأعداد الصحيحة في المعالجات...
و لكنها مستخدمة في الـ floating point numbers .... كما ترى هي قرارات مهندسي الحاسوب.. و كثير من مكتبات الأعداد تستخدم هذه الطريقة ...
هناك أيضاً one complement يمكنك البحث عنها :) و ربما هناك طرق أكثر....
اقتباسكلامك صحيح تماما، و لكن كيف يمكن معرفة عدد البتات التى يحجزها الرقم السالب إن لم نعرف عدد البتات الخاصه بالرقم الموجب لهذا العدد. لإن العدد السالب كل البتات الخاصه به تكون معكوسه و بالتالى فإن البتات الأخيره منه تكون واحد، ياريت توضح لى النقطه دى لو تقدر علشان انا مش مستوعبها بشكل جيد.
لو قلنا بأننا نريد أن نمثل العدد العشري 1 بالنظام الثنائي, فإن عدد الـ bits التي سوف نحتاجها bit واحد فقط ... الآن كيف نمثل العدد العشري 1- ؟
كما ترى استخدمنا "خانة" لتمثيل الإشارة السالبة في النظام العشري, لأنها مناسبة أكثر لنا البشر.... و هذا اصطلاح لا أكثر!
مهندسو الحاسوب, اكتشفوا أن أفضل طريقة هي تمثيل العدد السالب عن طريق المتمم....
لسبب بسيط جداً, لأنهم مهووسون بأداء المعالج...
انظر مثلاً, لجمع العدد 1 مع العدد 1- باستخدام المتمم :: على افتراض أن المساحة هي byte واحد فقط ..
00000001 + 11111111 --------------- 00000000
كما ترى حصلنا على 0 دون حتى النظر إلى إشارة العدد أو القيام بالطرح بدلاً الجمع, و لا حتى التفكير في إشارة العدد من الأساس :)
هي يعتمدون على خاصية مهمة جداً, و هي أن الحاسوب محدود الذاكرة, فكل bit يخرج عن نطاق الـ byte لم يعد موجوداً, أو لنقل أنه أصبح carried :)
و كما ترى, فإننا لا يمكننا معرفة متمم الواحد إلا بمعرفة عدد الخانات المتوفرة لدينا أو الـ bits ... (على عكس البشر الذين يفرقون بين الأرقام و الإشارة السالبة :) )
و لذلك لتمثيل 1- في 32 bits فإننا سوف نقوم باستهلاك الـ 32 bits كاملة....
11111111 = -1 1111111111111111 = -1 111111111111111111111111 = -1 11111111111111111111111111111111 = -1
تحياتي ...
تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 30 مايو 2009 في 02:47
السلام عليكم ....
اكتشفت bug في الكود الذي كتبته و هذا التعديل :P
int occupied(int number){
int comparator = 0x80000000, bits = 32;
while(!(number & comparator) && bits)
{
bits--;
comparator >>= 1;
}
return bits;
}الخطأ كان يظهر في الدالة السابقة عندما تمرر لها العدد صفر!
تحياتي ...
شكرا يا خالد على الإيضاح شرح جميل
ممكن اسألك لو تعرف كتاب بيتكلم عن الموضوع ده بشكل مفصل - تمثيل الأعداد الصحيحه و العشريه داخل الكمبيوتر - لإن حتى كتب الأسمبلى مبتتكلمش عن الموضوع ده بشكل مفصل
و جزاك الله خيرا
مدونتي: C++ Tips and Tricks
هذا الموضوع مغلق.