বিটওয়াইজ অপারেশন আমাদের বাইনারি সংখ্যার ভেতরের আলাদা আলাদা ডিজিট নিয়ে কাজ করার সুযোগ দেয়।
Elm তার Bitwise মডিউলে বেশ কিছু বিটওয়াইজ অপারেটর দেয়।
একটি সংখ্যার আলাদা আলাদা বিট পরিবর্তন করাকে মাস্কিং বলা হয়।
একটি মাস্ক হলো এমন একটি সংখ্যা যেখানে নির্দিষ্ট বিটগুলো একটি নির্দিষ্ট ধরনে সেট করা থাকে, যাতে and, or আর xor-এর মতো বিটওয়াইজ অপারেটর দিয়ে আরেকটি সংখ্যা নিয়ে কাজ করা যায়।
and দুটি সংখ্যাকে এমনভাবে মেলায় যে কেবল দুটিতেই 1 আছে এমন বিটগুলোই থাকে।
কোনো একটি বিট সেট করা আছে কি না, তা দেখার জন্য এটি কাজে লাগে।
উদাহরণস্বরূপ, একটি সংখ্যার ৪র্থ বিটটি 1 সেট করা আছে কি না দেখতে চাইলে, সেটিকে 01000 (দশমিকে 8) মাস্কের সাথে and করুন, তারপর ফলাফলটি শূন্য নয় কি না দেখুন:
Bitwise.and 13 8 --> 8
-- 13 = 01101
-- 8 = 01000
-- and = 01000 = 8
or দুটি সংখ্যাকে এমনভাবে মেলায় যে প্রতিটি বিট 1 হয়ে যায় যদি তা দুটির যেকোনো একটি বা দুটিতেই 1 থাকে।
নির্দিষ্ট একটি বিট 1 করে তুলতে এটি কাজে লাগে।
উদাহরণস্বরূপ, 10101-এর ২য় বিটটি সেট করতে, এটিকে 00010 মাস্কের সাথে or করুন:
Bitwise.or 21 2 --> 23
-- 21 = 10101
-- 2 = 00010
-- or = 10111 = 23
xor দুটি সংখ্যাকে এমনভাবে মেলায় যে প্রতিটি বিট 1 হয়ে যায় যদি তা একটি সংখ্যায় 1 কিন্তু অন্যটিতে 0 থাকে।
কোনো বিটকে তার বিপরীত মানে উল্টে দিতে এটি কাজে লাগে:
Bitwise.xor 20 5 --> 17
-- 20 = 10100
-- 5 = 00101
-- xor = 10001 = 17
complement একটি সংখ্যার প্রতিটি বিট উল্টে দেয় (0 হয়ে যায় 1, 1 হয়ে যায় 0)।
খেয়াল রাখুন, এর ফলে ধনাত্মক সংখ্যা ঋণাত্মক হয়ে যায় আর ঋণাত্মক সংখ্যা ধনাত্মক হয়ে যায়।
এর কারণ, বাইনারিতে ঋণাত্মক সংখ্যা সবচেয়ে বামের অবস্থানে 1 দিয়ে প্রকাশ করা হয়।
Bitwise.complement 21 --> -22
-- 21 = 00000000000000000000000000010101
-- complement = 11111111111111111111111111101010 = -22
নিচের অপারেটরগুলো বিটগুলোকে নির্দিষ্ট সংখ্যক অবস্থান বামে বা ডানে সরায়, যার ফলে কার্যত ২-এর ঘাত দিয়ে গুণ বা ভাগ হয়।
shiftLeftBy বিটগুলোকে বামে সরায় আর ডান দিক থেকে 0 দিয়ে পূরণ করে।
উদাহরণস্বরূপ, 21-কে ৩ ঘর বামে শিফট করতে:
Bitwise.shiftLeftBy 3 21 --> 168
-- 21 = 10101
-- shiftLeftBy 3 = 10101000 = 168
এটি 21 * 2^3 = 21 * 2 * 2 * 2 = 168 বলারই সমান
shiftRightBy: বিটগুলোকে ডানে সরায়:
Bitwise.shiftRightBy 2 21 --> 5
-- 21 = 10101
-- shiftRightBy 2 = 00101 = 5
২ ঘর ডানে শিফট করা আর ৪ দিয়ে ইন্টিজার ভাগ করা একই কথা।
খেয়াল রাখুন, এই ফাংশনটি সবচেয়ে বামের বিটে যে মানই থাকুক তা নকল করে। তাই ঋণাত্মক সংখ্যা ঋণাত্মকই থেকে যায়:
Bitwise.shiftRightBy 3 -21 --> -3
-- -21 = 111...101011
-- shiftRightBy 3 = 111...11101 = -3
আপনি যদি ডানে শিফট করতে চান আর শূন্য দিয়ে পূরণ করতে চান, তাহলে shiftRightZfBy ব্যবহার করুন:
Bitwise.shiftRightZfBy 3 -21 --> 536870909
-- -21 = 111...101011
-- shiftRightZfBy 3 = 00111...11101 = 536870909
আপনার বন্ধু এইমাত্র আপনাকে একটি গুরুত্বপূর্ণ গোপন তথ্যসহ একটি বার্তা পাঠিয়েছেন। অন্যরা যাতে সহজে সেটি পড়তে না পারে, তাই একের পর এক বিট ম্যানিপুলেশন করে বার্তাটি এনক্রিপ্ট করা হয়েছে। বার্তাটি ডিক্রিপ্ট করতে সাহায্য করার ফাংশনগুলো আপনাকে লিখতে হবে।
বার্তাটি ডিক্রিপ্ট করার প্রথম ধাপ হলো, বিটগুলো আবার ডান দিকে শিফট করে এনক্রিপশন প্রক্রিয়ার শিফটটি বাতিল করা।
ডিক্রিপ্ট করার পরের কিছু ধাপে ধরে নেওয়া হয় যে বাম দিক থেকে 0 ঢোকানো হয়েছে।
shiftBack ফাংশনটি লিখুন, যা কত ঘর শিফট করতে হবে সেই সংখ্যা এবং একটি মান নেয় ও শিফটটি সম্পন্ন করে।
shiftBack 2 42 --> 10
এরপর এমন কিছু বিট আছে যেগুলোকে 1 সেট করতে হবে।
setBits ফাংশনটি লিখুন, যা একটি মাস্ক ও একটি মান নেয় এবং মানের বিটগুলো 1 সেট করার ফলাফল রিটার্ন করে।
মানের কোনো বিটের জায়গায় মাস্কের বিটও 1 হলে, সেই বিটটি 1 সেট করতে হবে।
বাকি সব বিট অপরিবর্তিত রাখতে হবে।
setBits 66 212 --> 64
এনক্রিপশনের সময় কিছু বিট ফ্লিপ করা হয়। বার্তাটি ডিক্রিপ্ট করতে সেগুলো আবার ফ্লিপ করতে হবে।
flipBits ফাংশনটি লিখুন, যা একটি মাস্ক ও একটি মান নেয়।
মানের কোন কোন বিট ফ্লিপ করতে হবে, মাস্কটি তা নির্দেশ করে।
মাস্কে কোনো বিট 1 হলে, মানের সেই বিটটি ফ্লিপ করা হয়।
বাকি সব বিট অপরিবর্তিত রাখা হয়।
flipBits 23 157 --> 138
এমন কিছু বিটও আছে যেগুলো ডিক্রিপ্ট করলে সবসময় 0 হয়।
clearBits ফাংশনটি লিখুন, যা একটি মাস্ক ও একটি মান নেয়।
মাস্কের কোনো বিট 1 হলে, value-এর সেই বিটটি 0 সেট করতে হবে।
বাকি সব বিট অপরিবর্তিত রাখতে হবে।
clearBits 2 15 --> 13
এখন আপনার প্রয়োজনীয় সব ফাংশন তৈরি হয়ে গেছে, তাই আপনি আপনার বন্ধুর বার্তাটি ডিকোড করতে পারেন।
decrypt ফাংশনটি লিখুন, যা নিচের কাজগুলো সম্পন্ন করে:
decrypt 380182 --> 11840
অনুগ্রহ করে আগের কাজগুলোতে আপনি যে ফাংশনগুলো লিখেছিলেন, সেগুলো দিয়েই decrypt ফাংশনটি লিখুন।
Exercism-এ সাইন আপ করুন, Elm ট্র্যাকের 28টি কনসেপ্ট110টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।