الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هل تستطيع حساب عدد البتات التى يستخدمها متغير Integer

مغلق
بدأه C++er في 29 مايو 2009 · 12 رد · 2,866 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كما هو واضح من السؤال المطلوب هو داله تحسب عدد البتات bits التى يستهلكها متغير int

فعلى سبيل المثال الرقم 5 يستهلك 3 بت و الرقم 16 يستهلك 5 بت :resentful:

**********************

أضاقه على الداله : اجعلها تتعامل مع الأرقام السالبه و الموجبه :D

مدونتي: C++ Tips and Tricks

#2

هل السؤال صعب لهذه الدرجه ؟؟

تم تعديل هذه المشاركة بواسطة Game Expert في 29 مايو 2009 في 22:15

مدونتي: C++ Tips and Tricks

#3

assembler ؟

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#4

السلام عليكم

اللى أعرفه ان اى متغير من النوع 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

هو يقصد ان عدد مثل 5 مثلا يتم تمثيله ثنائيا هكذا :

101

اذا يأخذ 3 بت

عدد مثل 664 :

1010011000

اذا يأخذ 10 بت

وهكذا ...

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#6

السلام عليكم

دا برنامج للأعداد الموجبه

#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;
}

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#7

use Union :D

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#8

ده مجرد اختبار يجماعه للتسليه مش اكتر و كنت عايز اشوف طريقة كل واحد
و على العموم طريقتى اهى اتمنى انها متكنش سيئه

#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

#9

السلام عليكم ....

سؤال جميل :)

و هذا حلي ::

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

#10

رائع اخى خالد

دالتك افضل كثيرا من الداله التى صنعتها

و لكن لى سؤال

اقتباس
الأعداد السالبة ليس لها تمثيل موحد

للحصول على العدد السالب نقوم بعكس كل البتات للرقم الموجب لهذا العدد ثم نضيف واحد بت. هذه الطريقه الوحيده لتمثيل الأعداد السالبه التى اعرفها فهل توجد طرق أخرى؟

اقتباس
طريقتك تحسب عدد الـ bits اللازمة للقيمة المطلقة للعدد السالب و ليس للعدد السالب نفسه

كلامك صحيح تماما، و لكن كيف يمكن معرفة عدد البتات التى يحجزها الرقم السالب إن لم نعرف عدد البتات الخاصه بالرقم الموجب لهذا العدد. لإن العدد السالب كل البتات الخاصه به تكون معكوسه و بالتالى فإن البتات الأخيره منه تكون واحد، ياريت توضح لى النقطه دى لو تقدر علشان انا مش مستوعبها بشكل جيد.

و جزاك الله خيرا

تم تعديل هذه المشاركة بواسطة Game Expert في 30 مايو 2009 في 02:15

مدونتي: C++ Tips and Tricks

#11
اقتباس
دالتك افضل كثيرا من الداله التى صنعتها

كل الطرق تؤدي إلى روما :)

اقتباس
للحصول على العدد السالب نقوم بعكس كل البتات للرقم الموجب لهذا العدد ثم نضيف واحد بت. هذه الطريقه الوحيده لتمثيل الأعداد السالبه التى اعرفها فهل توجد طرق أخرى؟

هذه طريقة, و ليست حقيقة علمية :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

#12

السلام عليكم ....

اكتشفت bug في الكود الذي كتبته و هذا التعديل :P

int occupied(int number){

	int comparator = 0x80000000, bits = 32;

	while(!(number & comparator) && bits)
	{
		bits--;
		comparator >>= 1;
	}

return bits;
}

الخطأ كان يظهر في الدالة السابقة عندما تمرر لها العدد صفر!

تحياتي ...

#13

شكرا يا خالد على الإيضاح شرح جميل

ممكن اسألك لو تعرف كتاب بيتكلم عن الموضوع ده بشكل مفصل - تمثيل الأعداد الصحيحه و العشريه داخل الكمبيوتر - لإن حتى كتب الأسمبلى مبتتكلمش عن الموضوع ده بشكل مفصل

و جزاك الله خيرا

مدونتي: C++ Tips and Tricks

هذا الموضوع مغلق.

مواضيع مشابهة