View Full Version : مبتدی: کار با بیتها در c
internet explorer
جمعه 20 آذر 1394, 16:57 عصر
سلام
من تازه برنامه نویسی سی رو شروع کردم و برای یک پروژه احتیاج دارم که تک تک بیتها را در سی دستکاری کنم ولی استفاده از مبنای دو برای اینکار کمی سخته میخوام ببینم تابعی توی سی هست که بشه به مثلا n امین بیت یه متغیر دسترسی پیدا کرد یا مثلا دوتا بیت را با هم جابجا کرد؟
ممنون
pswin.pooya
جمعه 20 آذر 1394, 17:53 عصر
کلا اکثر زبانهای برنامه نویسی از جمله اسمبلی و C با کلمه و یا خیلی بخوان تخفیف بدن با بایت کار می کنن. اما خب شما می تونید باترکیبهای مربوط عملیاتی بیتی رو انجام بدید. یکی از روشهای راحت کن استفاده از ماکروها هست مثل ماکروی زیر:
#define SET_BIT(_var,_bit) _var =_var | (1>>_bit)
یکسری از کامپایلرها هم از جمله GCC عملیات بیتی رو به صورت extension پیاده سازی کردن که استاندارد نیست:
struct x
{
char bit_1 : 1;
char bit_2 : 1
char bit_3_and_4 : 2
....
}
در C++11 هم یکسری لیترالها (در کنار لیترال های هگزادسیمال و اکتال ) و همینطور لیترالها custom تعریف شد که بازهم کار رو یکم راحتر کرد مثلا برای لیترال باینری:
char value_4 = 0b0100;
به غیر از اون یکسری کامپایلرهای خاص منظوره دیگه مثل CodeVision AVR هم عملیات بینی با دات رو معرفی کردن:
PORT_B.2 = PORT_B.3;
اما روش اول از همه روشهای دیگه سازگارتر هست و portableتر هست.
Ananas
شنبه 21 آذر 1394, 00:28 صبح
#define SET_BIT(_var,_bit) _var =_var | (1>>_bit)
جسارتا شیفت به راست رو تغییر میدیم به شیفت به چپ:
#define SET_BIT(_var,_bit) _var =_var | (1<<_bit)
ولی فقط برای اعمال کردن 1 روی اون بیت هست. نه صفر!
من دو تابع میفرستم که کار باهاش راحت تر باشه:
bool GetBit(const long x, const int index)
{
return (x & (1L << index)) != 0;
};
long SetBit(const long x, const int index, const bool val)
{
if (val)
return x | (1L << index);
else
return x & ~(1L << index);
};
pswin.pooya
شنبه 21 آذر 1394, 18:35 عصر
ولی فقط برای اعمال کردن 1 روی اون بیت هست. نه صفر!
برای صفر کردن کافیه and کنی با معکوسش.
من دو تابع میفرستم که کار باهاش راحت تر باشه:
برای افزایش سرعت بهتره اینجور توابع رو یا inline بکنید. یا اینکه از ماکروها استفاده بکنید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.