"হাই, অ্যামিগো!"

"আমি বিটমাস্ক এবং XOR সম্পর্কেও কথা বলতে চাই।"

"আপনি ইতিমধ্যেই জানেন যে সংখ্যাগুলি বিট নিয়ে গঠিত এবং আপনি এই বিটগুলিতে বিভিন্ন ক্রিয়াকলাপ সম্পাদন করতে পারেন৷ একটি বিটমাস্ক হল একটি একক পূর্ণসংখ্যা হিসাবে বিভিন্ন লজিক্যাল মান (সত্য/মিথ্যা মান) এর উপস্থাপনা৷ এই ক্ষেত্রে, প্রতিটি বুলিয়ান-মান এর সাথে মিলে যায়৷ একটি নির্দিষ্ট বিট। এটি কীভাবে করা যেতে পারে তা এখানে:"

"দুটি (1, 2, 4, 8, 16, 32, ...) ক্ষমতার বাইনারি উপস্থাপনা শুধুমাত্র একটি বিট সেট করা জড়িত:"

সংখ্যা বাইনারি উপস্থাপনা
1 0000 0001
2 0000 0010
4 0000 0100
8 0000 1000
16 0001 0000
19 (দুজনের শক্তি নয়) 0001 0011
31 (দুজনের শক্তি নয়) 0001 1111

"সুতরাং, যেকোনো পূর্ণসংখ্যাকে বিটগুলির একটি অ্যারে বা বুলিয়ান মানগুলির একটি অ্যারে হিসাবে বিবেচনা করা যেতে পারে।"

"এখানে আপনি কিভাবে একটি সংখ্যায় বিভিন্ন বুলিয়ান মান সংরক্ষণ করতে পারেন:"

বুলিয়ান মান
boolean a = true;
boolean b = false;
boolean c = true;
boolean d = false;
মানগুলি একটি সংখ্যায় প্যাক করা হয়েছে:
int result = 0;
 if (a) result += 1; // 1 == 20 — bit 0
 if (b) result += 2; // 2 == 21 — bit 1
 if (c) result += 4; // 4 == 22 — bit 2
 if (d) result += 8; // 8 == 23 — bit 3

"এখন প্রতিটি বিট হল 1 যদি সংশ্লিষ্ট বুলিয়ান ভেরিয়েবলটি সত্য হয়।"

আমাদের ক্ষেত্রে, a এবং c ভেরিয়েবল সত্য ছিল, তাই ফলাফল 1+4 == 5 এর সমান

0000 0101
0000 dcba

"আমি মনে করি আমি জানি কি ঘটছে।"

"আচ্ছা, আপনি যদি বুঝতে পারেন তবে চলুন।"

"একটি int-এর 32টি বিট রয়েছে। তাদের মধ্যে একটি সংখ্যার চিহ্নের জন্য ব্যবহৃত হয়, এবং অন্য 31টি 31টি বুলিয়ান ভেরিয়েবলের মান সংরক্ষণ করতে ব্যবহার করা যেতে পারে।"

"এ লং এর 64 বিট আছে যেখানে আমরা 63টি বুলিয়ান ভেরিয়েবল সঞ্চয় করতে পারি।"

"হ্যাঁ।"

"একটি সংখ্যার মধ্যে কয়েক ডজন ভেরিয়েবল বিভক্ত। এটি বেশ কয়েকটি।"

"কিন্তু এটা কোথায় প্রয়োগ করা হয়?"

"প্রধানত এমন পরিস্থিতিতে যেখানে আপনাকে অবজেক্ট সম্পর্কে অনেক তথ্য সঞ্চয় করতে হবে। যখন আপনি একটি বস্তু সম্পর্কে অনেক তথ্য সঞ্চয় করেন, সেখানে সর্বদা কয়েক ডজন বুলিয়ান ভেরিয়েবল থাকে। "এই পদ্ধতির সাথে, সেগুলি সবই সুবিধাজনকভাবে একটি সংখ্যায় সংরক্ষণ করা হয় "

"সংরক্ষিত' শব্দের উপর জোর দিয়ে। কারণ আসলে নম্বর ব্যবহার করা এতটা সুবিধাজনক নয়।"

"যাইহোক, আমি এটাই জিজ্ঞেস করতে চেয়েছিলাম। আমরা কিভাবে সংখ্যা থেকে বুলিয়ান মান বের করব?"

"এটি মোটেও জটিল নয়। ধরা যাক বিট 6 1 এ সেট করা হয়েছে কিনা (2 থেকে পাঁচের শক্তি 32) কিনা তা নির্ধারণ করতে হবে। আমরা এইভাবে পরীক্ষা করতে পারি:"

একটি সংখ্যায় একত্রিত করুন:
int a = 32; // 25 == 0010 0000
int b = 8; // 23 == 0000 1000
int c = 2; // 21 == 0000 0010

int result = a + b + c; // 32 + 8 + 2 == 42 == 0010 1010
নির্দিষ্ট বিট চেক করে মান বের করুন:
int a = result & 32; // 0010 1010 & 0010 0000 = 0010 0000
int b = result & 8; // 0010 1010 & 0000 1000 = 0000 1000
int c = result & 2; // 0010 1010 & 0000 0010 = 0000 0010

"এইভাবে, বিটমাস্কের সাথে কাজ করার জন্য তিনটি অপারেশন জড়িত:"

1)  একটি নির্দিষ্ট বিট 0 এ সেট করুন

2)  একটি নির্দিষ্ট বিট 1 এ সেট করুন

3)  নির্দিষ্ট বিটের মান পরীক্ষা করুন।

"উদাহরণস্বরূপ, বিট 6 নিন।"

"আপনি কিভাবে বিট 6 থেকে 1 সেট করবেন?"

কোড বর্ণনা
result = result | 01000000;
result |= 01000000;
আপনি কিভাবে বিট 6 থেকে 1 সেট করবেন?
result = result & 10111111;
result &= 10111111;
আপনি কিভাবে বিট 6 থেকে 0 সেট করবেন?
c = result & 01000000;
আপনি কিভাবে বিট 6 এর মান পাবেন?

"এটি অত্যন্ত অস্বাভাবিক, কিন্তু কঠিন নয়। ম্যান, এখন আমি একজন হট-শট প্রোগ্রামার।"

"এবং 0 বা 1: 01000000 বা 10111111 সেট করা একটি নির্দিষ্ট বিট দিয়ে কীভাবে সহজেই সংখ্যাগুলি পেতে হয় সে সম্পর্কে আরও একটি ছোট টিপ।"

এই জন্য, আমাদের আছে  >> এবং  << অপারেটর।

"1 হল 2 থেকে শূন্য শক্তি। অন্য কথায়, বিট 0 সহ একটি সংখ্যা 1 এ সেট করা হয়েছে। আমাদের বিট 6 সেট সহ একটি সংখ্যা প্রয়োজন।"

int c = 1 << 6; // 0000 0001 << 6 == 0100 0000 == 64

"কুল! এই ধরনের ক্ষেত্রে এটি সত্যিই সহায়ক।"

"কিন্তু আমার যদি এমন একটি সংখ্যার প্রয়োজন হয় যেখানে প্রতিটি বিট 1 এ সেট করা হয় তবে একটি নির্দিষ্ট বিট 0 এ সেট করা থাকে?"

"এটিও কঠিন নয়:"

int d = ~(1 << 6); // ~0100 0000 == 10111111

"অন্য কথায়, এটি সব খুব সহজ:"

কোড বর্ণনা
result = result | (1 << 6);
result |= (1 << 6);
আপনি কিভাবে বিট 6 থেকে 1 সেট করবেন?
result = result & ~(1 << 6);
result &= ~(1 << 6);
আপনি কিভাবে বিট 6 থেকে 0 সেট করবেন?
c = result & (1 << 6);
আপনি কিভাবে বিট 6 এর মান পাবেন?

"এটা খুব কঠিন মনে হচ্ছে না। কিন্তু আমি এখনই মনে রাখব না।"

"কিন্তু, আপনি যদি অন্য কারো কোডে "ফলাফল &= ~(1 << 6)" এর মতো ভীতিকর অভিব্যক্তির সম্মুখীন হন, তাহলে আপনি জানতে পারবেন যে এই ব্যক্তিটি কেবল একটি বিটমাস্কের সাথে কাজ করছে।"

"এবং যদি আপনি প্রায়শই এটির মুখোমুখি হন তবে এটি আপনার জন্য নিজেকে মনে রাখবে।"

"নিজেকে মনে রাখবেন... ভালো লাগছে। পাঠের জন্য ধন্যবাদ।"