গোপনীয়তা

গোপনীয়তা

লার্নিং অনুশীলনী

ভূমিকা

বিটওয়াইজ অপারেশন

বিটওয়াইজ অপারেশন আমাদের বাইনারি সংখ্যার ভেতরের আলাদা আলাদা ডিজিট নিয়ে কাজ করার সুযোগ দেয়।

Elm তার Bitwise মডিউলে বেশ কিছু বিটওয়াইজ অপারেটর দেয়।

মৌলিক অপারেশন

একটি সংখ্যার আলাদা আলাদা বিট পরিবর্তন করাকে মাস্কিং বলা হয়। একটি মাস্ক হলো এমন একটি সংখ্যা যেখানে নির্দিষ্ট বিটগুলো একটি নির্দিষ্ট ধরনে সেট করা থাকে, যাতে and, or আর xor-এর মতো বিটওয়াইজ অপারেটর দিয়ে আরেকটি সংখ্যা নিয়ে কাজ করা যায়।

and

and দুটি সংখ্যাকে এমনভাবে মেলায় যে কেবল দুটিতেই 1 আছে এমন বিটগুলোই থাকে। কোনো একটি বিট সেট করা আছে কি না, তা দেখার জন্য এটি কাজে লাগে। উদাহরণস্বরূপ, একটি সংখ্যার ৪র্থ বিটটি 1 সেট করা আছে কি না দেখতে চাইলে, সেটিকে 01000 (দশমিকে 8) মাস্কের সাথে and করুন, তারপর ফলাফলটি শূন্য নয় কি না দেখুন:

Bitwise.and 13 8 --> 8
--  13 = 01101
--   8 = 01000
-- and = 01000 = 8
or

or দুটি সংখ্যাকে এমনভাবে মেলায় যে প্রতিটি বিট 1 হয়ে যায় যদি তা দুটির যেকোনো একটি বা দুটিতেই 1 থাকে। নির্দিষ্ট একটি বিট 1 করে তুলতে এটি কাজে লাগে। উদাহরণস্বরূপ, 10101-এর ২য় বিটটি সেট করতে, এটিকে 00010 মাস্কের সাথে or করুন:

Bitwise.or 21 2 --> 23
-- 21 = 10101
--  2 = 00010
-- or = 10111 = 23
এক্সক্লুসিভ-অর (xor)

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

নির্দেশনা

আপনার বন্ধু এইমাত্র আপনাকে একটি গুরুত্বপূর্ণ গোপন তথ্যসহ একটি বার্তা পাঠিয়েছেন। অন্যরা যাতে সহজে সেটি পড়তে না পারে, তাই একের পর এক বিট ম্যানিপুলেশন করে বার্তাটি এনক্রিপ্ট করা হয়েছে। বার্তাটি ডিক্রিপ্ট করতে সাহায্য করার ফাংশনগুলো আপনাকে লিখতে হবে।

1. বিটগুলো পিছনে শিফট করুন

বার্তাটি ডিক্রিপ্ট করার প্রথম ধাপ হলো, বিটগুলো আবার ডান দিকে শিফট করে এনক্রিপশন প্রক্রিয়ার শিফটটি বাতিল করা। ডিক্রিপ্ট করার পরের কিছু ধাপে ধরে নেওয়া হয় যে বাম দিক থেকে 0 ঢোকানো হয়েছে।

shiftBack ফাংশনটি লিখুন, যা কত ঘর শিফট করতে হবে সেই সংখ্যা এবং একটি মান নেয় ও শিফটটি সম্পন্ন করে।

shiftBack 2 42 --> 10

2. কিছু বিট সেট করুন

এরপর এমন কিছু বিট আছে যেগুলোকে 1 সেট করতে হবে।

setBits ফাংশনটি লিখুন, যা একটি মাস্ক ও একটি মান নেয় এবং মানের বিটগুলো 1 সেট করার ফলাফল রিটার্ন করে। মানের কোনো বিটের জায়গায় মাস্কের বিটও 1 হলে, সেই বিটটি 1 সেট করতে হবে। বাকি সব বিট অপরিবর্তিত রাখতে হবে।

setBits 66 212 --> 64

3. নির্দিষ্ট বিট ফ্লিপ করুন

এনক্রিপশনের সময় কিছু বিট ফ্লিপ করা হয়। বার্তাটি ডিক্রিপ্ট করতে সেগুলো আবার ফ্লিপ করতে হবে।

flipBits ফাংশনটি লিখুন, যা একটি মাস্ক ও একটি মান নেয়। মানের কোন কোন বিট ফ্লিপ করতে হবে, মাস্কটি তা নির্দেশ করে। মাস্কে কোনো বিট 1 হলে, মানের সেই বিটটি ফ্লিপ করা হয়। বাকি সব বিট অপরিবর্তিত রাখা হয়।

flipBits 23 157 --> 138

4. নির্দিষ্ট বিট ক্লিয়ার করুন

এমন কিছু বিটও আছে যেগুলো ডিক্রিপ্ট করলে সবসময় 0 হয়।

clearBits ফাংশনটি লিখুন, যা একটি মাস্ক ও একটি মান নেয়। মাস্কের কোনো বিট 1 হলে, value-এর সেই বিটটি 0 সেট করতে হবে। বাকি সব বিট অপরিবর্তিত রাখতে হবে।

clearBits 2 15 --> 13

5. একটি বার্তা ডিক্রিপ্ট করুন

এখন আপনার প্রয়োজনীয় সব ফাংশন তৈরি হয়ে গেছে, তাই আপনি আপনার বন্ধুর বার্তাটি ডিকোড করতে পারেন। decrypt ফাংশনটি লিখুন, যা নিচের কাজগুলো সম্পন্ন করে:

  1. আপনার বন্ধুর জন্মসাল (1996) থেকে বিট সেট করুন।
  2. আপনি প্রথম দেখা করেছিলেন সেই সাল (2009) দিয়ে ফলাফলটি ফ্লিপ করুন।
  3. আপনি ও আপনার বন্ধু একসাথে যে কতগুলো ক্লাসে পড়েন, সেই সংখ্যা (5) দিয়ে বিটগুলো পিছনে শিফট করুন।
  4. প্রথম ও পঞ্চম বিট ক্লিয়ার করুন।
decrypt 380182 --> 11840

অনুগ্রহ করে আগের কাজগুলোতে আপনি যে ফাংশনগুলো লিখেছিলেন, সেগুলো দিয়েই decrypt ফাংশনটি লিখুন।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Elm Exercism

গোপনীয়তা শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Elm ট্র্যাকের 28টি কনসেপ্ট110টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।