কম্পিউটার টিউটোরিয়াল

সি প্রোগ্রামিং-এ বিট ফিল্ডস (Bit Fields)


বিট ফিল্ড কী?

মান लीজিয়েআপনার সি প্রোগ্রামে TRUE/FALSE ভেরিয়েবলগুলোর একটি গ্রুপ একটি স্ট্রাকচারে থাকে যার নাম status:

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

এই স্ট্রাকচারটির জন্য ৮ বিট মেমরি স্পেস দরকার হয়, কিন্তু আসলে আমরা প্রতিটি ভেরিয়েবলে শুধু ০ বা ১ সংরক্ষণ করব। সি প্রোগ্রামিং ভাষা এমন পরিস্থিতিতে মেমরি স্পেস সঠিকভাবে ব্যবহার করার একটি ভালো পদ্ধতি দেয়।

যদি আপনি স্ট্রাকচারের ভিতরে এমন ভেরিয়েবল ব্যবহার করেন, তবে আপনি ভেরিয়েবলের প্রস্থ (width) সংজ্ঞায়িত করতে পারেন যা সি কম্পাইলারকে বলে দেবে যে আপনি শুধু उतने বিট ব্যবহার করবেন। উদাহরণস্বরূপ, উপরের স্ট্রাকচারটিকে নিচের মতো লিখা যেতে পারে:

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

উপরের স্ট্রাকচারটির জন্য status ভেরিয়েবল ৪ বিট মেমরি স্পেস নেয়, কিন্তু শুধু ২ বিট মান সংরক্ষণের জন্য ব্যবহার হবে।

যদি আপনি ৩২টি ভেরিয়েবল ব্যবহার করেন যাদের প্রতিটির প্রস্থ ১ বিট, তবে status স্ট্রাকচারও ৪ বিট ব্যবহার করবে। কিন্তু যতক্ষণ ৩৩টি ভেরিয়েবল হবে, ততক্ষণ এটি মেমরির পরবর্তী স্লট অ্যালোকেট করবে এবং ৮ বিট ব্যবহার করা শুরু করবে। নিচের উদাহরণটি দেখুন:

উদাহরণ কোড

#include <stdio.h>
#include <string.h>

/* সাধারণ স্ট্রাকচার সংজ্ঞায়িত */
struct {
    unsigned int widthValidated;
    unsigned int heightValidated;
} status1;

/* বিট ফিল্ডসহ স্ট্রাকচার সংজ্ঞায়িত */
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;
}

আউটপুট

Memory size occupied by status1 : 8
Memory size occupied by status2 : 4

বিট ফিল্ড ঘোষণা

একটি স্ট্রাকচারের ভিতরে বিট-ফিল্ড ঘোষণার নিচের ফর্মটি থাকে:

struct {
    type [member_name] : width ;
};

নিচের টেবিলটি বিট ফিল্ডের ভেরিয়েবল উপাদানগুলো বর্ণনা করে:

এলিমেন্টসবিবরণ
typeএকটি পূর্ণসংখ্যা টাইপ যা বিট-ফিল্ডের মান কীভাবে ব্যাখ্যা করা হবে তা নির্ধারণ করে। টাইপ হতে পারে int, signed int, বা unsigned int।
member_nameবিট-ফিল্ডের নাম।
widthবিট-ফিল্ডে বিটের সংখ্যা। প্রস্থ নির্দিষ্ট টাইপের বিট প্রস্থের চেয়ে কম বা সমান হতে হবে।

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

struct {
    unsigned int age : 3;
} Age;

উপরের স্ট্রাকচার সংজ্ঞায়ন সি কম্পাইলারকে নির্দেশ করে যে age ভেরিয়েবলটি শুধু ৩ বিট ব্যবহার করে মান সংরক্ষণ করবে। যদি আপনি ৩ বিটের বেশি ব্যবহার করার চেষ্টা করেন, তবে এটি অনুমতি দেবে না। নিচের উদাহরণটি দেখুন:

উদাহরণ কোড

#include <stdio.h>
#include <string.h>

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

আউটপুট

Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0
  1. স্ট্রাকচার কনসেপ্ট ব্যবহার করে সি ভাষায় বিট ফিল্ড ব্যাখ্যা

  2. C গ্রাফিক্স-এ bar() ফাংশন

  3. C প্রোগ্রাম: অ্যারে রেঞ্জের গুণফল মডুলো P-এ

  4. সি/সি++-তে মাল্টিডাইমেনশনাল অ্যারে (Multidimensional Arrays)