আমি সি প্রোগ্রামিংয়ে মোটামুটি নতুন, এবং আমি বিট মাস্কিংয়ের মুখোমুখি হয়েছি। কেউ আমাকে বিট মাস্কিংয়ের সাধারণ ধারণা এবং কার্যকারিতা ব্যাখ্যা করতে পারে? উদাহরণগুলি অনেক প্রশংসা করা হয়।
আমি সি প্রোগ্রামিংয়ে মোটামুটি নতুন, এবং আমি বিট মাস্কিংয়ের মুখোমুখি হয়েছি। কেউ আমাকে বিট মাস্কিংয়ের সাধারণ ধারণা এবং কার্যকারিতা ব্যাখ্যা করতে পারে? উদাহরণগুলি অনেক প্রশংসা করা হয়।
উত্তর:
কোন মাস্ক সংজ্ঞা দেয় আপনি কোন বিট রাখতে চান এবং কোন বিটগুলি আপনি সাফ করতে চান।
মাস্কিং একটি মানকে মাস্ক প্রয়োগের কাজ। এটি করে সম্পন্ন করা হয়:
নীচে মানটিতে বিটের একটি উপসেট আহরণের উদাহরণ দেওয়া আছে:
Mask: 00001111b
Value: 01010101b
মানকে মাস্ক প্রয়োগ করার অর্থ হ'ল আমরা প্রথম (উচ্চতর) 4 টি বিট সাফ করতে চাই এবং সর্বশেষ (নিম্ন) 4 বিট রাখতে চাই। এইভাবে আমরা নিম্ন 4 টি বিট বের করেছি। ফলাফল হলো:
Mask: 00001111b
Value: 01010101b
Result: 00000101b
মাস্কিং AND ব্যবহার করে কার্যকর করা হয়, সুতরাং সি তে আমরা পাই:
uint8_t stuff(...) {
uint8_t mask = 0x0f; // 00001111b
uint8_t value = 0x55; // 01010101b
return mask & value;
}
এখানে মোটামুটি সাধারণ ব্যবহারের ক্ষেত্রে: বৃহত্তর শব্দ থেকে স্বতন্ত্র বাইটগুলি বের করা। আমরা শব্দটিতে হাই-অর্ডার বিটগুলি প্রথম বাইট হিসাবে সংজ্ঞায়িত করি। আমরা এর জন্য দুটি অপারেটর ব্যবহার করি &
, এবং >>
(ডানদিক সিফ্ট)। এভাবেই আমরা 32-বিট পূর্ণসংখ্যা থেকে চারটি বাইট বের করতে পারি:
void more_stuff(uint32_t value) { // Example value: 0x01020304
uint32_t byte1 = (value >> 24); // 0x01020304 >> 24 is 0x01 so
// no masking is necessary
uint32_t byte2 = (value >> 16) & 0xff; // 0x01020304 >> 16 is 0x0102 so
// we must mask to get 0x02
uint32_t byte3 = (value >> 8) & 0xff; // 0x01020304 >> 8 is 0x010203 so
// we must mask to get 0x03
uint32_t byte4 = value & 0xff; // here we only mask, no shifting
// is necessary
...
}
লক্ষ্য করুন যে আপনি উপরের অপারেটরদের ক্রমটি স্যুইচ করতে পারেন, আপনি প্রথমে মুখোশটি করতে পারেন, তারপরে শিফটটি করতে পারেন। ফলাফলগুলি একই, তবে এখন আপনাকে একটি ভিন্ন মুখোশ ব্যবহার করতে হবে:
uint32_t byte3 = (value & 0xff00) >> 8;
&
।
#define MASK 0x000000FF .... my_uint32_t &= ~MASK
।
b
বাইনারি ইঙ্গিত আক্ষরিক সব কম্পাইলার দ্বারা সমর্থিত নয়, সঠিক?
মাস্কিং মানে তথ্যের একটি কাঙ্ক্ষিত অংশ রাখা / পরিবর্তন করা / অপসারণ করা। একটি চিত্র-মাস্কিং অপারেশন দেখতে দিন; যেমন- এই মাস্কিং অপারেশন ত্বক নয় এমন কোনও জিনিস মুছে ফেলছে-
আমরা উদাহরণস্বরূপ এবং অপারেশন করছি । এছাড়াও অন্যান্য মাস্কিং অপারেটর রয়েছে- ওআর , এক্সওআর ।
বিট-মাস্কিং অর্থ বিটগুলির উপরে মাস্ক চাপানো। এখানে এবং এর সাথে কিছুটা মাস্কিং করা হচ্ছে -
1 1 1 0 1 1 0 1 [input] (&) 0 0 1 1 1 1 0 0 [mask] ------------------------------ 0 0 1 0 1 1 0 0 [output]
সুতরাং, কেবলমাত্র মাঝারি 4 টি বিট (যেমন এই বিটগুলি 1
এই মাস্কটিতে রয়েছে) রয়ে গেছে।
সঙ্গে এই দেখা যাক XOR যাও -
1 1 1 0 1 1 0 1 [input] (^) 0 0 1 1 1 1 0 0 [mask] ------------------------------ 1 1 0 1 0 0 0 1 [output]
এখন, মাঝের 4 টি বিটগুলি উল্টানো হয়েছে ( 1
হয়ে উঠেছে 0
, 0
হয়ে গেছে 1
)।
সুতরাং, বিট-মাস্ক ব্যবহার করে আমরা পৃথক বিট [ উদাহরণ ] অ্যাক্সেস করতে পারি । কখনও কখনও, এই কৌশলটি কার্যকারিতা উন্নতির জন্যও ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ এটি গ্রহণ করুন-
bool isOdd(int i) {
return i%2;
}
এই ফাংশনটি বলে যে কোনও পূর্ণসংখ্যা বিজোড় / সমান কিনা। আমরা বিট-মাস্ক ব্যবহার করে আরও দক্ষতার সাথে একই ফলাফল অর্জন করতে পারি-
bool isOdd(int i) {
return i&1;
}
সংক্ষিপ্ত বিবরণ : যদি বাইনারি সংখ্যার সর্বনিম্ন উল্লেখযোগ্য বিট হয় 1
তবে তা বিজোড়; জন্য 0
এটা এমনকি হতে হবে। সুতরাং, এর সাথে এবং এর মাধ্যমে 1
আমরা কমপক্ষে উল্লেখযোগ্য বিট বাদে অন্য সমস্ত বিট অপসারণ করছি:
55 -> 0 0 1 1 0 1 1 1 [input] (&) 1 -> 0 0 0 0 0 0 0 1 [mask] --------------------------------------- 1 <- 0 0 0 0 0 0 0 1 [output]