1. বিটওয়াইজ বাম শিফট
জাভাতেও 3টি বিটওয়াইজ শিফট অপারেটর রয়েছে : আপনার যদি সত্যিই প্রয়োজন হয়, আপনি খুব সহজভাবে একটি সংখ্যার বিভিন্ন অবস্থানের সমস্ত বিট বাম বা ডানে স্থানান্তর করতে পারেন।
একটি সংখ্যার বিটগুলিকে বাম দিকে স্থানান্তর করতে, আপনার প্রয়োজন বিটওয়াইজ বাম শিফট অপারেটর । এটি এইভাবে লেখা হয়েছে:
a << b
কোথায় a
যে সংখ্যার বিট স্থানান্তরিত হচ্ছে, এবং b
এটি এমন একটি সংখ্যা যা নির্দেশ করে যে সংখ্যাটির বিটগুলিকে কতবার a
বাম দিকে স্থানান্তর করতে হবে। এই অপারেশন চলাকালীন, ডানদিকে লো-অর্ডার বিট যোগ করা হয় শূন্য।
উদাহরণ:
উদাহরণ | ফলাফল |
---|---|
|
|
|
|
|
|
|
|
একটি সংখ্যাকে বামে স্থানান্তরিত করলে একটি সংখ্যাকে 2 দ্বারা গুণ করার মতো একই প্রভাব রয়েছে।
একটি সংখ্যা 16 দ্বারা গুণ করতে চান? 16 24 এর সমান । সুতরাং আপনি বাম দিকে সংখ্যা 4 সংখ্যা স্থানান্তর করুন
2. বিটওয়াইজ ডানদিকে সরান
বিটগুলিও ডানদিকে স্থানান্তরিত করা যেতে পারে। এটি করার জন্য, বিটওয়াইজ ডান শিফট অপারেটর ব্যবহার করুন । এটি এইভাবে লেখা হয়েছে:
a >> b
কোথায় a
যে সংখ্যার বিট স্থানান্তর করা হচ্ছে, এবং সংখ্যার বিট ডানে b
স্থানান্তর করার জন্য কতবার সংখ্যা ।a
উদাহরণ:
উদাহরণ | ফলাফল |
---|---|
|
|
|
|
|
|
|
|
একটি সংখ্যাকে ডানদিকে স্থানান্তর করা একটি সংখ্যাকে 2 দ্বারা ভাগ করার মতো একই প্রভাব ফেলে।
এই অপারেশন চলাকালীন, বাম দিকে যোগ করা হাই-অর্ডার বিটগুলি শূন্য হয়, কিন্তু সবসময় নয় !
একটি স্বাক্ষরিত সংখ্যার বামদিকের বিটটিকে সাইন বিট বলা হয় : যদি সংখ্যাটি ধনাত্মক হয় তবে তা হল 0
; কিন্তু সংখ্যা নেতিবাচক হলে, এই বিট হয় 1
.
একটি সংখ্যার বিট ডানদিকে স্থানান্তর করার সময়, সাইন বিটের মানও সাধারণত স্থানান্তরিত হবে এবং সংখ্যার চিহ্নটি হারিয়ে যাবে। তদনুসারে, নেতিবাচক সংখ্যার জন্য (যেখানে বামদিকের বিটটি রয়েছে 1
), এই বিটটি বিশেষ চিকিত্সা পায়। একটি সংখ্যার বিটগুলিকে ডানদিকে স্থানান্তর করার সময়, 0
বামদিকে a যোগ করা হয় যদি বামদিকের বিটটি ছিল 0
, এবং 1
যদি বামদিকের বিটটি হয় তবে বামদিকে a যোগ করা হয় 1
।
কিন্তু উপরের উদাহরণে, এটি ফলাফল বলে মনে হচ্ছে না। কেন? কারণ পূর্ণসংখ্যার আক্ষরিক হল int
s, এবং প্রকৃতপক্ষে এর অর্থ হল । অর্থাৎ, বামদিকের বিটটি শূন্য।0b11111111
0b00000000000000000000000011111111
অনেক প্রোগ্রামার এই ডান-বদল আচরণের দ্বারা হতাশ এবং সংখ্যাটিকে সর্বদা শূন্য দিয়ে প্যাড করা পছন্দ করবে। তাই জাভা আরেকটি রাইট শিফট অপারেটর যোগ করেছে ।
এটি এইভাবে লেখা হয়েছে:
a >>> b
কোথায় a
যে সংখ্যার বিট স্থানান্তর করা হচ্ছে, এবং সংখ্যার বিট ডানে b
স্থানান্তর করার জন্য কতবার সংখ্যা । a
সংখ্যার সাইন বিটের মূল মান নির্বিশেষে এই অপারেটর সর্বদা বাম দিকে শূন্য যুক্ত করে a
।
3. পতাকা নিয়ে কাজ করা
প্রোগ্রামাররা বিটওয়াইজ এবং শিফট অপারেশনের ভিত্তিতে অধ্যয়নের একটি প্রায় সম্পূর্ণ নতুন ক্ষেত্র তৈরি করেছে: পতাকা নিয়ে কাজ করা।
যখন কম্পিউটারের খুব কম মেমরি ছিল, তখন একটি সংখ্যায় অনেক তথ্য ক্র্যাম করা অত্যন্ত জনপ্রিয় ছিল। একটি সংখ্যাকে বিটগুলির একটি অ্যারে হিসাবে বিবেচনা করা হয়েছিল: একটি int হল 32 বিট, এবং একটি দীর্ঘ হল 64 বিট।
আপনি এই ধরনের একটি সংখ্যায় অনেক তথ্য লিখতে পারেন, বিশেষ করে যদি আপনার যৌক্তিক ( true
বা false
) মান সংরক্ষণ করতে হয়। একটি একক 64টি উপাদান নিয়ে গঠিত long
একটি অ্যারের মতো । এই বিটগুলিকে পতাকাboolean
বলা হত এবং নিম্নলিখিত ক্রিয়াকলাপগুলি ব্যবহার করে ম্যানিপুলেট করা হয়েছিল:
-
পতাকা লাগানো(একটি নির্দিষ্ট বিট সমান করুন
1
) -
পতাকা পুনরায় সেট করুন(একটি নির্দিষ্ট বিট সমান করুন
0
) -
পতাকা চেক করুন(একটি নির্দিষ্ট বিটের মান পরীক্ষা করুন)
এবং বিটওয়াইজ অপারেটরদের সাথে এটি কীভাবে করা হয় তা এখানে।
একটি পতাকা স্থাপন
একটি নির্দিষ্ট বিট সেট করার জন্য 1
, আপনি যে সংখ্যার বিট সেট করতে চান এবং একটি বিশেষভাবে তৈরি করা সংখ্যার মধ্যে একটি বিটওয়াইজ বা অপারেশন করতে হবে, যেখানে শুধুমাত্র সেই বিটটি 1
।
উদাহরণস্বরূপ, ধরুন আপনার নম্বর আছে 0b00001010
এবং আপনাকে 5 তম বিট সেট করতে হবে 1
। এই ক্ষেত্রে, আপনার প্রয়োজন:
0b00001010 | 0b00010000 = 0b00011010
যদি 5 তম বিটটি ইতিমধ্যে একটিতে সেট করা থাকে তবে কিছুই পরিবর্তন হত না।
সাধারণভাবে, একটি পতাকা সেট করার অপারেশন নিম্নরূপ লেখা যেতে পারে
a | (1 << b)
কোথায় a
কার নম্বর বিট সেট করা হবে 1
। এবং b
বিট এর অবস্থান নির্ধারণ করতে হবে। বাম শিফট অপারেটর ব্যবহার করা এখানে খুবই সুবিধাজনক, যেহেতু আপনি অবিলম্বে বলতে পারবেন আমরা কোন বিট নিয়ে কাজ করছি।
একটি পতাকা রিসেট করা হচ্ছে
একটি নির্দিষ্ট বিট রিসেট করতে (অর্থাৎ এটি সেট করুন ) অন্যান্য বিটগুলিকে বিরক্ত না করে, আপনাকে যে নম্বরের বিটটি রিসেট করতে চান তার মধ্যে 0
একটি অপারেশন করতে হবে (অর্থাৎ সেট করুন ) এবং একটি বিশেষভাবে তৈরি করা সংখ্যা, যেখানে সমস্ত বিটগুলি ব্যতীত সমান আপনি যে বিট রিসেট করতে চান তার জন্য।&
0
1
উদাহরণস্বরূপ, ধরুন আপনার নম্বর আছে 0b00001010
এবং আপনাকে ৪র্থ বিট সেট করতে হবে 0
। এই ক্ষেত্রে, আপনার প্রয়োজন:
0b00001010 & 0b11110111 = 0b00000010
যদি 4 র্থ বিটটি ইতিমধ্যেই শূন্যে সেট করা থাকে তবে কিছুই পরিবর্তন হত না।
সাধারণভাবে, একটি পতাকা রিসেট করার অপারেশনটি নিম্নরূপ লেখা যেতে পারে
a & ~(1 << b)
কোথায় a
সেই নম্বর যার বিট রিসেট করা হবে 0
। আর b
বিটের অবস্থান পরিষ্কার করতে হবে।
1
এমন একটি সংখ্যা পেতে যেখানে আমরা শূন্য হতে চাই একটি ছাড়া সব বিট আছে , আমরা প্রথমে 1 বি অবস্থান বাম দিকে স্থানান্তর করি এবং তারপর NOT
ফলাফলটি উল্টাতে বিটওয়াইজ অপারেটর ব্যবহার করি।
একটি পতাকা পরীক্ষা করা হচ্ছে
একটি নির্দিষ্ট পতাকা সেট করা বা রিসেট করার পাশাপাশি, কখনও কখনও আপনাকে একটি প্রদত্ত পতাকা সেট করা আছে কিনা তা পরীক্ষা করতে হবে, যেমন একটি নির্দিষ্ট বিট এর সমান কিনা 1
। এটি একটি বিটওয়াইজ দিয়ে করা বেশ সহজ &
।
উদাহরণস্বরূপ, ধরুন আপনাকে 4র্থ বিটটি 1
সংখ্যায় সেট করা আছে কিনা তা পরীক্ষা করতে হবে 0b00001010
। তারপরে আপনাকে এটি করতে হবে:
if ( (0b00001010 & 0b00001000) == 0b00001000 )
সাধারণভাবে, একটি পতাকা চেক করার অপারেশনটি নিম্নরূপ লেখা যেতে পারে
(a & (1 << b)) == (1 << b)
কোথায় a
কার নম্বর বিট চেক করা হচ্ছে। এবং b
বিটের অবস্থানটি পরীক্ষা করতে হবে।
4. এনক্রিপশন
বিটওয়াইজ XOR
অপারেশন প্রায়শই প্রোগ্রামাররা সাধারণ এনক্রিপশনের জন্য ব্যবহার করে। সাধারণভাবে, এই ধরনের এনক্রিপশন এই মত দেখায়:
result = number ^ password;
number
আমরা যে ডেটা এনক্রিপ্ট করতে চাই তা কোথায় , password
ডেটার জন্য একটি "পাসওয়ার্ড" হিসাবে ব্যবহৃত একটি বিশেষ নম্বর এবং result
এটি এনক্রিপ্ট করা নম্বর৷
number == (number ^ password) ^ password;
এখানে গুরুত্বপূর্ণ বিষয় হল যে যখন XOR
অপারেটরটি একটি সংখ্যায় দুইবার প্রয়োগ করা হয়, তখন এটি "পাসওয়ার্ড" নির্বিশেষে আসল সংখ্যা তৈরি করে।
number
থেকে পুনরুদ্ধার করতে encrypted result
, আপনাকে শুধু আবার অপারেশন করতে হবে:
original number = result ^ password;
উদাহরণ:
class Solution
{
public static int[] encrypt(int[] data, int password)
{
int[] result = new int[data.length];
for (int i = 0; i < data.length; i++)
result[i] = data[i] ^ password;
return result;
}
public static void main(String[] args)
{
int[] data = {1, 3, 5, 7, 9, 11};
int password = 199;
// Encrypt the array of data
int[] encrypted = encrypt(data, password);
System.out.println(Arrays.toString(encrypted));
// Decrypt the array of data
int[] decrypted = encrypt(encrypted, password);
System.out.println(Arrays.toString(decrypted));
}
}