সি – বিট ক্ষেত্র (C – Bit Fields)

সি - বিট ক্ষেত্র (C - Bit Fields)
Md. Amirul Islam (ARIF)
Bogra

ধরুন আপনার সি প্রোগ্রামে একটি স্ট্রাচার নামক কয়েকটি TRUE/FALSE ভেরিয়াবল গ্রুপ ।
নিম্নরূপ:

struct
{
unsigned int widthValidated;
unsigned int heightValidated;
} status;

এই স্ট্রাচারের লাগে ৮ বাইট মেমোরি স্পেস কিন্তু আমরা প্রত্যেক ভেরিয়াবলে সংরক্ষণ করতে যাচ্ছি 0 অথবা 1 । সি প্রোগ্রামিং ল্যাঙ্গুয়েজ স্বল্প মেমোরি স্পেস ব্যবহার করতে একটি ভাল সুবিধা করে দিয়েছে । যদি আপনি এই ভেরিয়াবল ব্যাবহার করেন একটি স্ট্রাকচারের ভিতরে তারপর আপনি সংজ্ঞায়িত করতে পারবেন একটি ভেরিয়াবল এর প্রস্থ যা সি কম্পিলার বলে যে আপনি সুধুমাত্র সেই বাইট সংখ্যা ব্যাবহার করতে যাচ্ছেন ।
নিম্নে উদাহরণস্বরূপ, উপরোক্ত গঠন পুনরায় লেখা যেতে পারে:

struct
{
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status;

এখন, উপরোক্ত গঠনে 4 বাইট মেমোরি স্পেস স্ট্যাটাস ভেরিয়াবল এর জন্য লাগবে কিন্তু শুধুমাত্র 2 বিট ব্যাবহার হবে ভেলু গুলো জমা রাখতে । যদি আপনি প্রত্যেকটি একটি 1 বিটের প্রস্থে 32 ভেরিয়াবল ব্যাবহার করতে চান, তারপরেও স্ট্যাটাস স্ট্রাকচারে 4 বাইট হবে । কিন্তু যখনি আপনার ৩৩ ভেরিয়াবল থাকবে তখন এটি মেমোরির পরবর্তী স্লটে বরাদ্দ হবে । এবং এটাতে ৮ বাইট ব্যাবহার হবে।
আমাদের ধারণা বুঝতে নিম্নলিখিত উদাহরণে পরীক্ষা করা যাক:
#include
#include

/* define simple structure */
struct
{
unsigned int widthValidated;
unsigned int heightValidated;
} status1;

/* define a structure with bit fields */
struct
{
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status2;

int main( )
{
printf( "Memory size occupied by status1 : %d\n", sizeof(status1));
printf( "Memory size occupied by status2 : %d\n", sizeof(status2));

return 0;
}

যখন উপরের কোড গুলো প্রণীত ও অনুষ্ঠিত (compiled and executed) হয় তখন নিম্নলিখিত ফলাফল সৃষ্টি করে:
Memory size occupied by status1 : 8
Memory size occupied by status2 : 4

বিট ফিল্ড ঘোষণা (Bit Field Declaration)
একটি স্ট্রাকচারের ভিতর বিট ফিল্ডের ফর্ম ঘোষণা করা হয়ঃ

struct
{
type [member_name] : width ;
};

নিচে বিট ফিল্ডের ভেরিয়াবল উপাদানের বর্ণনা দেওয়া হলঃ

উপাদান বর্ণনা
type একটি ইন্টেগ্রা টাইপ (integer type) যেটা নির্ধারণ করে কিভাবে বিট ফিল্ডের এর মান ব্যাখ্যা করা হয়। টাইপ হতে পারেঃ int, signed int, unsigned int.
member_name বিট ফিল্ডের নাম।
width একটি বিট ফিল্ডের বিটের সংখ্যা। প্রস্থ (width) কে অবশ্যই নির্দিষ্ট প্রকারের বিট প্রস্থ এর সমান অথবা ছোট হতে হবে ।

একটি পূর্বনির্ধারিত প্রস্থ সঙ্গে সংজ্ঞায়িত ভেরিয়েবলকে বিট ফিল্ড বলা হয়। একটি বিট ক্ষেত্র একটি একক বিটের চেয়ে বেশি রাখা যাবে। উদাহরণস্বরূপ, যদি আপনার প্রয়োজন হয় একটি ভেরিয়াবল শুধুমাত্র ০ থেকে ৭ ভেলু জমা করতে তখন আপনি একটি বিট ফিল্ড সংজ্ঞায়িত করতে পারেন একটি ৩ বিটের প্রস্থের সাথে।
এরুপঃ

struct
{
unsigned int age : 3;
} Age;

উপরের গঠন সংজ্ঞা C কম্পাইলার নির্দেশ করে যে ভেলু জমা করতে এজ ভেরিয়াবল ব্যাবহার করছে শুধু ৩ বিট, যদি আপনি তিনের বেশি বিট ব্যাবহার করতে চেষ্টা করেন তখন এটা আপনাকে আনুমতি দেবে না ।
চলুন নিচের উধাহরন চেষ্টা করা যাকঃ

#include
#include

struct
{
unsigned int age : 3;
} Age;

int main( )
{
Age.age = 4;
printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
printf( "Age.age : %d\n", Age.age );

Age.age = 7;
printf( "Age.age : %d\n", Age.age );

Age.age = 8;
printf( "Age.age : %d\n", Age.age );

return 0;
}

যখন উপরের কোড গুলো প্রণীত ও অনুষ্ঠিত (compiled and executed) হয় তখন নিম্নলিখিত ফলাফল সৃষ্টি করে:

Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0

The above structure definition instructs C compiler. that age variable is going to use only 3 bits to store the value, if you will try to use more than 3 bits then it will not allow you to do so. Let us try the following example:

Permanent link to this article: http://bangla.sitestree.com/%e0%a6%b8%e0%a6%bf-%e0%a6%ac%e0%a6%bf%e0%a6%9f-%e0%a6%95%e0%a7%8d%e0%a6%b7%e0%a7%87%e0%a6%a4%e0%a7%8d%e0%a6%b0-c-bit-fields/