PDA

View Full Version : سوال: در مورد نوع boolean



Nabege
شنبه 16 شهریور 1392, 12:24 عصر
یه سوال دارم در مورد نوع boolean :
چرا نوع boolean با این که دو مقدار true و false بیشتر نمیگیره ولی 8 بیت از حافظه رو میگیره ؟!!
حتما می دونید که 8 بیت مربوط به 256 مقدار مختلف میشه .

UfnCod3r
شنبه 16 شهریور 1392, 13:05 عصر
اگه کتاب مبانی کامپوتر رو خونده باشی می فهمی کوچک ترین واحد حافظه بایته .

Nabege
شنبه 16 شهریور 1392, 13:19 عصر
ولی وجدانا حیف نیست به خاطر فقط دو مقدار true و false هشت بیت حافظه رو مصرف کنیم !!!
راهی نداره جای هشت بیت یک بیت حافظه رو به روشی اشغال کرد ؟؟!

omidshaman
شنبه 16 شهریور 1392, 13:29 عصر
راه هست که مثلا 8 تا بول رو تو یک دونه بایت ذخیره کنی ولی یکم کد نویسیش پیچیده میشه .

UfnCod3r
شنبه 16 شهریور 1392, 13:48 عصر
همینه که هست ناراضی ای ی سی پیو خودت بساز.
راهش اینه که از AND, ُSHIFT استفاده کنی و بیت های ی عدد 4 بایتی رو تغییر بدی .
از بیتفیلد ها هم می تونی استفاده کنی .
در کل اینا چون همش شیفت و.. باید بدی سرعت کم می شه خب

struct Bool8
{
char a : 1;
char b : 1;
char c : 1;
char d : 1;
char e : 1;
char f : 1;
char g : 1;
char h : 1;
};

Bool8 asd;
asd.a = true;
asd.b = false;

mehrdad_dost
شنبه 16 شهریور 1392, 14:09 عصر
با سلام خدمت شما

تا جایی که بنده اطلاع دارم (در یک کتاب مطالعه کردم)

امکان استفاده از بیت هم بود برای این مقدار

ولی چون میزان سرعت خواندن اطلاعات ۸ بیت از ۱ بیت بیشتر است

برای همین از این مقدار استفاده میشود

موفق و پیروز باشید

omidshaman
شنبه 16 شهریور 1392, 14:53 عصر
ذخیره کردن 8 تا بول توی 1 بایت :

#include <iostream>
using namespace std;
class Bool
{
public:
Bool ():
var(0)
{}

bool operator [](int index)
{
if(index>7)
throw "Wrong index";
return var & (1<<index);//var & pow(2,index)
}
void setCondition(int index,bool condition=true)
{
if(index>7)
throw "Wrong index";
if(condition)
{
var |= 1<<index;
}

else
{
var &= !(1<<index);
}
}

private:
char var;

};
int main()
{
Bool sml;
//test
sml.setCondition(2);
cout<<sml[2]<<endl;
sml.setCondition(2,false);
cout<<sml[2]<<endl;
sml.setCondition(2);
cout<<sml[2];
//
}

Nabege
یک شنبه 17 شهریور 1392, 08:58 صبح
بابا چرا اینقدر خودتونو با شیفت و اند و ... اذیت می کنید ! با یه فرمول ساده ی ریاضی تبدیل مبناها هم میتونیم 8 تا bool رو توی یک رقم 8 بیتی جا بدیم خیلی هم سادست هیچ دردسر هم نداره سرعتش هم بالاست :
هشت تا bool به نام a داریم
که اون رقم 8 بیتی ِ برابر این میشه:
a1 * 128 + a2 * 64 + a3 * 32 + a4 * 16 + a5 * 8 + a6 * 4 + a7 * 2 + a8

من اینارو می دونم ولی راهش چیه که به جای 8 بیت فقط به یک بیت دسترسی داشته باشیم ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟

مصطفی ساتکی
یک شنبه 17 شهریور 1392, 10:42 صبح
بابا چرا اینقدر خودتونو با شیفت و اند و ... اذیت می کنید ! با یه فرمول ساده ی ریاضی تبدیل مبناها هم میتونیم 8 تا bool رو توی یک رقم 8 بیتی جا بدیم خیلی هم سادست هیچ دردسر هم نداره سرعتش هم بالاست :
هشت تا bool به نام a داریم
که اون رقم 8 بیتی ِ برابر این میشه:
a1 * 128 + a2 * 64 + a3 * 32 + a4 * 16 + a5 * 8 + a6 * 4 + a7 * 2 + a8

instruction ضرب تو هیچ cpuی latency ش از instruction شیفت پایین تر نیست این عملیات ضرب چون در مبنای 2 هستند کامپایلر c++ در هنگام optimization در زمان کامپایل آنها را به شیفت تبدیل می کنه.

شما اگر دوست دارید به بیت دسترسی داشته باشید می تونید از and استفاده کنید چیز پیچیده ای نیست.

omidshaman
یک شنبه 17 شهریور 1392, 11:10 صبح
بابا چرا اینقدر خودتونو با شیفت و اند و ... اذیت می کنید ! با یه فرمول ساده ی ریاضی تبدیل مبناها هم میتونیم 8 تا bool رو توی یک رقم 8 بیتی جا بدیم خیلی هم سادست هیچ دردسر هم نداره سرعتش هم بالاست :
هشت تا bool به نام a داریم
که اون رقم 8 بیتی ِ برابر این میشه:
a1 * 128 + a2 * 64 + a3 * 32 + a4 * 16 + a5 * 8 + a6 * 4 + a7 * 2 + a8

من اینارو می دونم ولی راهش چیه که به جای 8 بیت فقط به یک بیت دسترسی داشته باشیم ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟؟؟
اون کد بالا رو دیدی اصلا؟
اگر میخوای به بیت درسترسی داشته باشی راهش همونه با شیفت خودتو اذیت کنی!