বিট মাস্কিং কি?


191

আমি সি প্রোগ্রামিংয়ে মোটামুটি নতুন, এবং আমি বিট মাস্কিংয়ের মুখোমুখি হয়েছি। কেউ আমাকে বিট মাস্কিংয়ের সাধারণ ধারণা এবং কার্যকারিতা ব্যাখ্যা করতে পারে? উদাহরণগুলি অনেক প্রশংসা করা হয়।


1
আপনি কি বিটওয়াইজ অপারেটরগুলি যেমন & | ^ ইত্যাদি এবং সাধারণভাবে বুলিয়ান যুক্তি? মুখোশ অপারেশনগুলির যে কোনও ব্যাখ্যার জন্য এটির প্রয়োজন হবে।
পল আর

1
হ্যাঁ আমার কাছে বিটওয়াইজ অপারেটরগুলি, এবং বুলিয়ান যুক্তির একটি ধারণা রয়েছে
মিঃজেড

2
আমি জানি লিঙ্কগুলি পোস্ট করা উচিত নয়, তবে উইকিপিডিয়া ব্যাখ্যাটি দুর্দান্ত:
en.wikedia.org/wiki/Mask_

2
লিপি পোস্ট করা ঠিক আছে, তবে কিছু বিবরণ সহ পেইপিক ঠিক আছে যাতে লিঙ্কটি যদি কোনও দিন মারা যায় তবে পোস্টটি তার উত্তর দেওয়ার উদ্দেশ্যটি সার্থক করতে সক্ষম হয়। এছাড়াও লিঙ্কটি কেবল প্রচারমূলক উদ্দেশ্যে হওয়া উচিত নয়।
ডেক্সটার

উত্তর:


244

কোন মাস্ক সংজ্ঞা দেয় আপনি কোন বিট রাখতে চান এবং কোন বিটগুলি আপনি সাফ করতে চান।

মাস্কিং একটি মানকে মাস্ক প্রয়োগের কাজ। এটি করে সম্পন্ন করা হয়:

  • বিটওয়াস এন্ডিং মানটির মধ্যে বিটের একটি উপসেট আহরণ করতে
  • বিটওয়াইস ওরিংটি মানটিতে বিটের একটি উপসেট সেট করতে
  • মানটিতে বিটের একটি উপসেট টগল করতে বিটওয়াইস জোরিং

নীচে মানটিতে বিটের একটি উপসেট আহরণের উদাহরণ দেওয়া আছে:

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;

5
ওআর বা এক্সওর ক্রিয়াকলাপ এবং একটি উপযুক্ত মাস্ক সহ নির্দিষ্ট বিটগুলি সেট করতে বা টগল করার জন্য ভাল উত্তর তবে মাস্কিং প্রয়োগ করা যেতে পারে ।
পল আর

@ ব্যবহারকারী 239558 উদাহরণ এবং সঠিক বাক্য গঠন জন্য ধন্যবাদ। @ পল আর আমি কি ব্যবহারকারী 239558 এর দ্বারা সরবরাহিত উদাহরণে কেবল মাস্ক এবং মান বলতে পারি
মিঃজেড

@ মিঃ জেডএজ: সি, সি ++ এবং সম্পর্কিত ভাষায় আপনি বিটওয়াইড এবং অপারেটর চাইবেন , যা হিসাবে লেখা আছে &
পল আর

@ Mr.Z উদাহরণস্বরূপ: বিষয়বস্তু দূরে মাস্কিং দ্বারা একটি uint32_t সুস্পষ্ট এক বাইট #define MASK 0x000000FF .... my_uint32_t &= ~MASK
লন্ডিন

bবাইনারি ইঙ্গিত আক্ষরিক সব কম্পাইলার দ্বারা সমর্থিত নয়, সঠিক?
Ungeheuer

76

মাস্কিং মানে তথ্যের একটি কাঙ্ক্ষিত অংশ রাখা / পরিবর্তন করা / অপসারণ করা। একটি চিত্র-মাস্কিং অপারেশন দেখতে দিন; যেমন- এই মাস্কিং অপারেশন ত্বক নয় এমন কোনও জিনিস মুছে ফেলছে-

এখানে চিত্র বর্ণনা লিখুন

আমরা উদাহরণস্বরূপ এবং অপারেশন করছি । এছাড়াও অন্যান্য মাস্কিং অপারেটর রয়েছে- ওআর , এক্সওআর


বিট-মাস্কিং অর্থ বিটগুলির উপরে মাস্ক চাপানো। এখানে এবং এর সাথে কিছুটা মাস্কিং করা হচ্ছে -

     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]

1
এছাড়াও, একটি পূর্ণসংখ্যাটিকে একটি বিজোড় নংতে রূপান্তর করতে। যদি এটি একটি সমান সংখ্যা হয়: i = i | 1। এটি কার্যকর হয় যখন আমরা 1, 3, 5, ..., 2, 4, 6, ... এর মতো ক্রম তৈরি করার চেষ্টা করি
হর্ষিত শর্মা

আপনি পূর্ণসংখ্যার থেকে কমপক্ষে উল্লেখযোগ্য বিট সহ সংখ্যাটি খুঁজতে নিম্নলিখিত ক্রিয়াকলাপটিও ব্যবহার করতে পারেন: lsb = i & -i
হর্ষিত শর্মা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.