Java-তে byte, short, int, long বা char-এর বিট ম্যানিপুলেট করার অপারেটর রয়েছে।
বিট বামে শিফট করতে << এবং ডানে শিফট করতে >> ব্যবহার করুন।
// Shift two places to the left
0b0000_1011 << 2;
// # => 0b0010_1100
// Shift two places to the right
0b0000_1011 >> 2;
// # => 0b0000_0010
<< অপারেটর সবসময় ডান দিকের প্রান্তে 0 বসায়।
কিন্তু >> বামদিকের সবচেয়ে বামের বিটটির মতোই বিট বসায় (সংখ্যাটি ঋণাত্মক হলে 1, ধনাত্মক হলে 0)।
// Shift 2 places to the right preserves the sign
// This is a negative value, whose binary representation is
// 1000_0000_0000_0000_0000_0000_0010_0110
int value = -0x7FFFFFDA;
// Shift two places to the right, preserving the sign bit
value >> 2;
// # => 1110_0000_0000_0000_0000_0000_0000_1001
ডানে শিফট করার সময় 0 বসাতে হলে বদলে >>> ব্যবহার করুন।
// Shift two places to the right, inserting 0s on the left
value >>> 2;
// # => 0010_0000_0000_0000_0000_0000_0000_1001
বিটওয়াইজ AND (&) অপারেটর দুটি মান নেয় এবং প্রতিটি বিটে একটি AND করে।
এটি প্রথম মানের প্রতিটি বিট দ্বিতীয় মানের একই অবস্থানের বিটের সাথে তুলনা করে।
দুটিই 1 হলে ফলাফলের বিটটি 1 হয়।
অন্যথায়, ফলাফলের বিটটি 0 হয়।
0b0110_0101 & 0b0011_1100;
// # => 0b0010_0100
বিটওয়াইজ OR (|) অপারেটর দুটি মান নেয় এবং প্রতিটি বিটে একটি OR করে।
এটি প্রথম মানের প্রতিটি বিট দ্বিতীয় মানের একই অবস্থানের বিটের সাথে তুলনা করে।
যেকোনো একটি বিট 1 হলে ফলাফলের বিটটি 1 হয়।
অন্যথায়, এটি 0 হয়।
0b0110_0101 | 0b0011_1100;
// # => 0b0111_1101
বিটওয়াইজ XOR অপারেটর (^) দুটি মানের উপর একটি বিটওয়াইজ XOR করে।
বিটওয়াইজ AND ও বিটওয়াইজ OR অপারেটরের মতোই, এটি প্রথম মানের প্রতিটি বিট দ্বিতীয় মানের একই অবস্থানের বিটের সাথে মিলিয়ে দেখে।
এদের মধ্যে কেবল একটি 1 হলে ফলাফলের বিটটি 1 হয়।
অন্যথায়, এটি 0 হয়।
0b0110_0101 ^ 0b0011_1100;
// # => 0b0101_1001
~)শেষে, বিটওয়াইজ NOT অপারেটর (~) প্রতিটি বিট উল্টে দেয়।
আগের অপারেটরগুলোর বিপরীতে, এটি একটি ইউনারি অপারেটর, যা কেবল একটি মানের উপর কাজ করে।
~0b0110_0101;
// # => 0b1001_1010
আপনার বন্ধু এইমাত্র একটি গুরুত্বপূর্ণ গোপন তথ্যসহ আপনাকে একটি বার্তা পাঠিয়েছেন। অন্যরা যাতে সহজে এটি পড়তে না পারে, তাই পরপর কিছু বিট ম্যানিপুলেশন করে বার্তাটি এনক্রিপ্ট করা হয়েছে। বার্তাটি ডিক্রিপ্ট করতে সাহায্য করার মেথডগুলো আপনাকে লিখতে হবে।
বার্তা ডিক্রিপ্ট করার প্রথম ধাপ হলো, বিটগুলো আবার ডানে শিফট করে এনক্রিপশনের সময় করা শিফটটি বাতিল করা। ডিক্রিপশনের পরের ধাপগুলো ধরে নেবে যে বাঁ দিক থেকে 0 যোগ করা হয়েছে।
Secrets.shiftBack মেথডটি লিখুন, যা একটি value এবং কত ঘর শিফট করতে হবে সেই সংখ্যা নেয় এবং শিফটটি সম্পন্ন করে।
Secrets.shiftBack(0b1001, 2);
# => 0b0010
এরপর, কিছু বিট আছে যেগুলো 1-এ সেট করতে হবে।
Secrets.setBits মেথডটি লিখুন, যা একটি value ও একটি mask নেয় এবং value-এর বিটগুলো 1-এ সেট করার ফলাফল রিটার্ন করে।
mask-এ যে বিটটি 1, value-এর সেই বিটটিও 1-এ সেট হতে হবে।
বাকি সব বিট অপরিবর্তিত রাখতে হবে।
Secrets.setBits(0b0110, 0b0101);
# => 0b0111
এনক্রিপশনের সময় কিছু বিট উল্টে দেওয়া হয়। বার্তা ডিক্রিপ্ট করতে সেগুলো আবার উল্টে দিতে হবে।
Secrets.flipBits মেথডটি লিখুন, যা একটি value ও mask নেয়।
কোন বিটগুলো উল্টাতে হবে তা mask নির্দেশ করে।
mask-এ বিটটি যদি 1 হয়, তবে value-এর বিটটি উল্টে যায়।
বাকি সব বিট অপরিবর্তিত থাকে।
Secrets.flipBits(0b1100, 0b0101);
# => 0b1001
সবশেষে, কিছু বিট আছে যেগুলো সবসময় 0-এ ডিক্রিপ্ট হয়।
Secrets.clearBits মেথডটি লিখুন, যা একটি value ও একটি mask নেয়।
mask-এ যে বিটটি 1, value-এর সেই বিটগুলো 0-এ সেট করতে হবে।
বাকি সব বিট অপরিবর্তিত রাখতে হবে।
Secrets.clearBits(0b0110, 0b0101);
# => 0b0010
Exercism-এ সাইন আপ করুন, Java ট্র্যাকের 26টি কনসেপ্ট158টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।