Crystal-এ বাইনারি স্তরে Int ম্যানিপুলেট করার জন্য বিটওয়াইজ অপারেটর রয়েছে।
Crystal-এ বিটকে বামে (<<) বা ডানে (>>) সরানোর জন্য শিফট অপারেটর রয়েছে।
<<)বামে শিফট অপারেটর (<<) বিটগুলোকে বামে সরায়।
শিফট করার মানটি বাম দিকে নির্দিষ্ট করা হয় এবং কত ঘর শিফট করতে হবে তার সংখ্যা ডান দিকে থাকে।
0b0010 << 1
# => 0b0100
0b0010 << 2
# => 0b1000
সংখ্যাটি ঋণাত্মক হলে এটি বদলে ডানে শিফট হবে।
0b0010 << -1
# => 0b0001
>>)ডানে শিফট অপারেটর (>>) বিটগুলোকে ডানে সরায়।
বামে শিফট অপারেটরের মতোই, শিফট করার মানটি বাম দিকে নির্দিষ্ট করা হয় এবং কত ঘর শিফট করতে হবে তার সংখ্যা ডান দিকে থাকে।
0b0100 >> 1
# => 0b0010
0b0100 >> 2
# => 0b0001
একইভাবে, সংখ্যাটি ঋণাত্মক হলে অপারেটরটি বামে শিফট করবে।
0b0100 >> -1
# => 0b1000
Crystal-এ বিটওয়াইজ অপারেশন করার জন্য ৩টি বাইনারি অপারেটর (&, |, ^) এবং একটি ~ অপারেটর রয়েছে।
&)বাইনারি AND অপারেটর (&) দুটি মানের উপর বিটওয়াইজ AND সম্পন্ন করে।
এটি প্রথম মানের প্রতিটি বিটকে দ্বিতীয় মানের একই অবস্থানের বিটের সাথে তুলনা করে।
দুটি বিটই ১ হলে ফলস্বরূপ বিটটি ১ সেট করা হয়।
অন্যথায়, এটি ০ সেট করা হয়।
0b0011 & 0b1010
# => 0b0010
|)বাইনারি OR অপারেটর (|) দুটি মানের উপর বিটওয়াইজ OR সম্পন্ন করে।
এটিও প্রথম মানের প্রতিটি বিটকে দ্বিতীয় মানের একই অবস্থানের বিটের সাথে তুলনা করে।
দুটির যেকোনো একটি বিট ১ হলে ফলস্বরূপ বিটটি ১ সেট করা হয়।
অন্যথায়, এটি ০ সেট করা হয়।
0b0011 | 0b1010
# => 0b1011
^)বাইনারি XOR অপারেটর (^) বিটওয়াইজ XOR সম্পন্ন করে।
বিটওয়াইজ AND এবং বিটওয়াইজ OR অপারেটরের মতোই, এটি প্রথম মানের প্রতিটি বিটকে দ্বিতীয় মানের একই অবস্থানের বিটের সাথে তুলনা করে।
যদি তাদের শুধু একটি ১ হয়, ফলস্বরূপ বিটটি ১ হয়।
অন্যথায়, এটি ০ হয়।
0b0011 ^ 0b1010
# => 0b1001
~)সবশেষে, বিটওয়াইজ NOT অপারেটর (~) মানটির প্রতিটি বিট উল্টে দেয়।
অন্য বাইনারি অপারেটরগুলোর বিপরীতে, এটি একটি ইউনারি অপারেটর, যা কেবল ডান দিকের মানের উপর কাজ করে।
~0b1110_0010
# => 0b0001_1101
আপনার বন্ধু এইমাত্র আপনাকে একটি গুরুত্বপূর্ণ গোপন বার্তা পাঠিয়েছেন। অন্যরা যাতে সহজে এটি পড়তে না পারে, সেজন্য একগুচ্ছ বিট ম্যানিপুলেশনের মাধ্যমে বার্তাটি এনক্রিপ্ট করা হয়েছে। বার্তাটি ডিক্রিপ্ট করতে সাহায্য করার জন্য আপনাকে একটি প্রোগ্রাম লিখতে হবে।
বার্তা ডিক্রিপ্ট করার প্রথম ধাপ হলো এনক্রিপশন প্রক্রিয়ার শিফটটি বাতিল করা, অর্থাৎ বিটগুলোকে আবার বামে শিফট করা। কত ঘর শিফট করতে হবে তা বার্তা অনুযায়ী ভিন্ন হতে পারে।
এমন একটি মেথড Secrets.shift_back ইমপ্লিমেন্ট করুন যেটি একটি মান এবং বামে শিফট করার ঘরসংখ্যা নেয়।
Secrets.shift_back(0b0001, 2)
# => 0b0100
পরের ধাপে নির্দিষ্ট কিছু বিটের মান বের করার জন্য একটি বিট মাস্ক প্রয়োগ করা হয়। মান এবং মাস্কের মধ্যে বিটওয়াইজ AND চালিয়ে মাস্কটি প্রয়োগ করা হয়।
এমন একটি মেথড Secrets.apply_mask ইমপ্লিমেন্ট করুন যেটি একটি মান নেয় এবং একটি মাস্ক প্রয়োগ করে।
Secrets.apply_mask(0b0110, 0b0101)
# => 0b0100
বিটগুলো বামে শিফট করার ফলে কিছু নতুন 0 বিট যোগ হয়েছে। এই নতুন বিটগুলোর কয়েকটিকে 1 করে সেট করতে হবে। বাকিগুলো অপরিবর্তিত রেখে নির্দিষ্ট কিছু বিট 1 করে সেট করার জন্য বিটওয়াইজ OR কাজে লাগে।
এমন একটি মেথড Secrets.set_bits ইমপ্লিমেন্ট করুন যেটি দুটি মান নেয় এবং একটি বিটওয়াইজ OR সম্পন্ন করে।
Secrets.set_bits(0b0110, 0b0101)
# => 0b111
এনক্রিপশন প্রক্রিয়ার একটি অংশে একটি সম্মত মানের সাথে XOR প্রয়োগ করা হয়। মূল মানে ফিরে যেতে চাইলে এনক্রিপ্ট করা মানটির সাথে আবার সম্মত মানটি XOR করলেই হবে। তবে একটি ভুল বোঝাবুঝির কারণে, XOR প্রয়োগ করার আগে আপনার বন্ধু সম্মত মানটির বিটগুলো উল্টে ফেলেছেন (অর্থাৎ সম্মত মানটির উপর বিটওয়াইজ NOT প্রয়োগ করেছেন)।
এমন একটি মেথড Secrets.reverse_xor ইমপ্লিমেন্ট করুন যেটি এনক্রিপ্ট করা ও সম্মত মান দুটি নেয় এবং মূল মানটি গণনা করে।
Secrets.reverse_xor(0b1100, 0b0101)
# => 0b(0110)
Exercism-এ সাইন আপ করুন, Crystal ট্র্যাকের 26টি কনসেপ্ট142টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।