আজকের পাঠে, আমরা জাভা বিটওয়াইজ অপারেটরদের সাথে পরিচিত হব এবং তাদের সাথে কীভাবে কাজ করতে হয় তার উদাহরণ বিবেচনা করব। আপনি সম্ভবত "বিট" শব্দটির সাথে পরিচিত। যদি তা না হয়, তাহলে এর অর্থ কী তা স্মরণ করা যাক :) একটি বিট হল কম্পিউটারে তথ্যের ক্ষুদ্রতম একক। এর নাম
বাইনারি ডিজিট থেকে এসেছে । একটি বিট দুটি সংখ্যার একটি দ্বারা প্রকাশ করা যেতে পারে: 1 বা 0। একটি এবং শূন্যের উপর ভিত্তি করে একটি বিশেষ বাইনারি সংখ্যা পদ্ধতি রয়েছে। আমরা এখানে কোন গাণিতিক জঙ্গলে ঢুকব না। আমরা শুধুমাত্র নোট করব যে জাভাতে যেকোনো সংখ্যাকে বাইনারি আকারে রূপান্তর করা যেতে পারে। এটি করার জন্য, আপনি wrapper ক্লাস ব্যবহার করতে হবে।
উদাহরণস্বরূপ, এখানে আপনি কিভাবে একটি
int এর জন্য এটি করতে পারেন :
public class Main {
public static void main(String[] args) {
int x = 342;
System.out.println(Integer.toBinaryString(x));
}
}
কনসোল আউটপুট:
101010110 1010 10110 (আমি এটি পড়া সহজ করার জন্য স্থান যোগ করেছি) দশমিক সিস্টেমে 342 নম্বর। আমরা আসলে এই সংখ্যাটিকে পৃথক বিটে ভেঙেছি: শূন্য এবং এক। বিটগুলিতে সঞ্চালিত অপারেশনগুলিকে
বিটওয়াইজ বলা হয় ।
এই অপারেটরটি খুবই সহজ: এটি আমাদের সংখ্যার প্রতিটি বিটকে অতিক্রম করে এবং বিটটি ফ্লিপ করে: শূন্যগুলি এক হয়ে যায়, এবং একটি শূন্য হয়ে যায়। যদি আমরা এটিকে আমাদের 342 নম্বরে প্রয়োগ করি, তাহলে এখানে যা ঘটে:
101010110 হল 342 একটি বাইনারি সংখ্যা হিসাবে উপস্থাপিত 010101001 হল অভিব্যক্তিটির মান ~342 চলুন এটি অনুশীলনে রাখার চেষ্টা করি:
public class Main {
public static void main(String[] args) {
int x = 342;
System.out.println(~x);
}
}
কনসোল আউটপুট:
169 169 হল আমাদের ফলাফল (
010101001 ) পরিচিত, দশমিক সিস্টেমে :)
আপনি দেখতে পাচ্ছেন, এটি যৌক্তিক AND (
&& ) এর সাথে বেশ মিল দেখায়।
&& অপারেটর , আপনি স্মরণ করবেন, উভয় অপারেন্ড সত্য হলেই সত্য ফেরত দেয়। Bitwise
এবং একইভাবে কাজ করে: এটি বিট করে দুটি সংখ্যার তুলনা করে। তুলনা একটি তৃতীয় সংখ্যা তৈরি করে। উদাহরণস্বরূপ, 277 এবং 432 সংখ্যাটি ধরা যাক:
110110000 হল 277 একটি বাইনারি সংখ্যা হিসাবে 1000101011 হল 432 একটি বাইনারি সংখ্যা হিসাবে উপস্থাপন করা হয়েছে পরবর্তী, অপারেটর
এবং নীচের সংখ্যার প্রথম বিটের সাথে উপরের সংখ্যার প্রথম বিটটির তুলনা করে। কারণ এটি একটি AND অপারেটর, ফলাফল 1 হবে শুধুমাত্র যদি উভয় বিট 1 হয়। অন্য কোন ক্ষেত্রে, ফলাফল 0. 100010101
&& অপারেটর প্রথমে, আমরা দুটি সংখ্যার প্রথম বিট, তারপর দ্বিতীয় বিট, তারপর তৃতীয়, ইত্যাদি তুলনা করি। আপনি দেখতে পাচ্ছেন, শুধুমাত্র দুটি ক্ষেত্রেই 1 (প্রথম এবং পঞ্চম বিট) সমান সংখ্যার উভয় সংশ্লিষ্ট বিট। অন্য সব তুলনা 0s উত্পাদিত. সুতরাং শেষ পর্যন্ত আমরা 10001000 নম্বর পেয়েছি। দশমিক পদ্ধতিতে, এটি 272 নম্বরের সাথে মিলে যায়। আসুন পরীক্ষা করা যাক:
public class Main {
public static void main(String[] args) {
System.out.println(277&432);
}
}
কনসোল আউটপুট:
272
এই অপারেটর একই ভাবে কাজ করে: বিট করে দুটি সংখ্যা তুলনা করা। শুধুমাত্র এখন যদি অন্তত একটি বিট 1 হয়, তাহলে ফলাফল 1 হয়। আসুন একই সংখ্যা (277 এবং 432) দেখুন: 100010101
| 110110000 _______________ 110110101 - এর ফলাফল
| অপারেটর এখানে আমরা একটি ভিন্ন ফলাফল পেয়েছি: শুধুমাত্র যে বিটগুলি শূন্য থাকে সেগুলি হল সেই বিটগুলি যা উভয় সংখ্যায় শূন্য ছিল। ফলাফল হল সংখ্যা 110110101। দশমিক পদ্ধতিতে, এটি 437 নম্বরের সাথে মিলে যায় আসুন পরীক্ষা করা যাক:
public class Main {
public static void main(String[] args) {
System.out.println(277|432);
}
}
কনসোল আউটপুট:
437 আমরা সবকিছু সঠিকভাবে গণনা করেছি! :)
- ^ - বিটওয়াইজ XOR (এক্সক্লুসিভ বা)
আমরা এখনো এই অপারেটরের সম্মুখীন হইনি। কিন্তু এটা নিয়ে জটিল কিছু নেই। এটি সাধারণ OR অপারেটরের অনুরূপ। একটি পার্থক্য আছে: ন্যূনতম একটি অপারেন্ড সত্য হলে সাধারণ OR সত্য দেখায়। কিন্তু এটি এক হতে হবে না: যদি উভয় অপারেন্ড সত্য হয়, ফলাফল সত্য। কিন্তু এক্সক্লুসিভ OR শুধুমাত্র সঠিকভাবে অপারেন্ডের একটি সত্য হলেই রিটার্ন করে। উভয় অপারেন্ড সত্য হলে, সাধারণ OR সত্য ("অন্তত একটি সত্য") প্রদান করে, কিন্তু XOR মিথ্যা প্রদান করে। এজন্য একে একচেটিয়া OR বলা হয়। পূর্ববর্তী বিটওয়াইজ অপারেটরগুলি কীভাবে কাজ করে তা জেনে, আপনি সম্ভবত 277
^ 432 সহজেই গণনা করতে পারেন। তবে আসুন এটিকে আরও একবার খনন করা যাক :) 100010101
^ 110110000 _______________ 010100101 - ^ এর ফলাফল
অপারেটর এটা আমাদের ফলাফল. যে বিটগুলি উভয় সংখ্যায় একই ছিল একটি 0 তৈরি করে (অর্থাৎ "কেবল একটি" পরীক্ষা ব্যর্থ হয়েছে)। কিন্তু যে বিটগুলি 0-1 বা 1-0 জোড়া তৈরি করেছিল তা হয়ে গেল। আমাদের ফলাফল হল 010100101 সংখ্যা। দশমিক পদ্ধতিতে, এটি 165 নম্বরের সাথে মিলে যায়। আসুন দেখি আমাদের গণনা সঠিক কিনা:
public class Main {
public static void main(String[] args) {
System.out.println(277^432);
}
}
কনসোল আউটপুট:
165 সুপার! সবকিছু আমরা যেমন ভেবেছিলাম ঠিক তেমনই :) এখন বিট শিফট অপারেটরদের সাথে পরিচিত হওয়ার সময়। নাম নিজেই কথা বলে। আমরা কিছু সংখ্যা নিই, এবং এর বিটগুলিকে বাম বা ডানে সরান :) দেখা যাক এটি কেমন দেখায়:
বামে স্থানান্তর করুন
বাম দিকে বিটগুলির একটি স্থানান্তর দ্বারা নির্দেশিত হয়
<< এখানে একটি উদাহরণ:
public class Main {
public static void main(String[] args) {
int x = 64;
int y = 3;
int z = (x << y);
System.out.println(Integer.toBinaryString(x));
System.out.println(Integer.toBinaryString(z));
}
}
এই উদাহরণে, x = 64 সংখ্যাটিকে মান বলা হয়। এটা আমরা স্থানান্তর করব যে মান বিট.
আমরা বিটগুলিকে বাম দিকে স্থানান্তর করব (আপনি << অপারেটরের দিক থেকে এটি অনুমান করতে পারেন ) বাইনারি সিস্টেমে, সংখ্যা 64 = 1000000 সংখ্যা
y = 3 টিকে শিফট দূরত্ব বলা হয়।
স্থানান্তরের দূরত্ব নির্দেশ করে যে আপনি কত বিট ডান/বামে স্থানান্তর করতে চান x সংখ্যাটির বিটগুলিকে আমাদের উদাহরণে, আমরা তাদের 3 বিট বাম দিকে স্থানান্তর করব। শিফট প্রক্রিয়াটি আরও স্পষ্টভাবে দেখতে, ছবিটি দেখুন। এই উদাহরণে, আমরা
int s ব্যবহার করি। Ints কম্পিউটারের মেমরিতে 32 বিট দখল করে। এইভাবে আমাদের আসল সংখ্যা 64 দেখায়:
এবং এখন আমরা আমাদের প্রতিটি বিট গ্রহণ করি এবং আক্ষরিকভাবে সেগুলিকে 3টি জায়গায় বামে স্থানান্তর করি:
আমরা কি পেয়েছি তা একবার দেখুন। আপনি দেখতে পাচ্ছেন, আমাদের সমস্ত বিট স্থানান্তরিত হয়েছে, এবং পরিসরের প্রান্ত থেকে আরও 3টি শূন্য যোগ করা হয়েছে। তিন, কারণ আমরা 3 দ্বারা স্থানান্তরিত করেছি। যদি আমরা 10 দ্বারা স্থানান্তরিত হতাম, 10টি শূন্য যোগ করা যেত। সুতরাং, এক্সপ্রেশন
x << y মানে " x সংখ্যাটির বিটগুলিকে y স্থান দ্বারা বাম দিকে স্থানান্তর করুন"। আমাদের এক্সপ্রেশনের ফলাফল হল 1000000000 সংখ্যা, যা দশমিক পদ্ধতিতে 512। আসুন পরীক্ষা করা যাক:
public class Main {
public static void main(String[] args) {
int x = 64;
int y = 3;
int z = (x << y);
System.out.println(z);
}
}
কনসোল আউটপুট:
512 স্পট অন! তাত্ত্বিকভাবে, বিটগুলি অবিরামভাবে স্থানান্তরিত হতে পারে, কিন্তু যেহেতু আমাদের নম্বরটি একটি
int , আমাদের কাছে মাত্র 32টি বাইনারি সংখ্যা উপলব্ধ রয়েছে। এর মধ্যে 7টি ইতিমধ্যে 64 (1000000) দ্বারা দখল করা হয়েছে। অতএব, যদি আমরা 27টি স্থান বামে স্থানান্তরিত করি, তবে আমাদের একমাত্র ডেটা টাইপের পরিসরের বাইরে চলে যাবে এবং হারিয়ে যাবে। শুধু শূন্য থাকবে!
public class Main {
public static void main(String[] args) {
int x = 64;
int y = 26;
int z = (x << y);
System.out.println(z);
}
}
কনসোল আউটপুট:
0 প্রত্যাশিত হিসাবে, একটি 32 উপলব্ধ বিট অতিক্রম করে এবং অদৃশ্য হয়ে গেছে। আমরা শুধুমাত্র শূন্য সমন্বিত একটি 32-বিট সংখ্যা দিয়ে শেষ করেছি।
স্বাভাবিকভাবেই, এটি দশমিক সিস্টেমে 0 এর সাথে মিলে যায়। এখানে বাম দিকের স্থানান্তরগুলি মনে রাখার জন্য একটি সহজ নিয়ম: বাম দিকে প্রতিটি শিফটের জন্য, সংখ্যাটি 2 দ্বারা গুণিত হয়। আসুন 111111111 বিটের ছবি ছাড়াই নিম্নলিখিত অভিব্যক্তিটি গণনা করার চেষ্টা করি << 3 আমাদের 1111111111 সংখ্যাটিকে 2 দ্বারা গুণ করতে
হবে । ফলস্বরূপ, আমরা 888888888 পাই। আসুন কিছু কোড লিখি এবং পরীক্ষা করি:
public class Main {
public static void main(String[] args) {
System.out.println(111111111 << 3);
}
}
কনসোল আউটপুট:
888888888
ডানদিকে সরান
এই অপারেশনটি
>> দ্বারা চিহ্নিত করা হয় । এটা একই জিনিস, কিন্তু অন্য দিকে! :) আমরা চাকা পুনরায় উদ্ভাবন করা হবে না. এর একই
int 64 দিয়ে চেষ্টা করা যাক.
public class Main {
public static void main(String[] args) {
int x = 64;
int y = 2;
int z = (x >> y);
System.out.println(z);
}
}
2 দ্বারা ডানদিকে স্থানান্তরের ফলে, আমাদের সংখ্যার দুটি চরম শূন্য সীমার বাইরে চলে যায় এবং হারিয়ে যায়। আমরা 10000 পাই, যা দশমিক সিস্টেমের কনসোল আউটপুটে 16 নম্বরের সাথে মিলে যায়:
16 ডানদিকে স্থানান্তরগুলি মনে রাখার জন্য এখানে একটি সহজ নিয়ম: ডান দিকের প্রতিটি শিফট দুটি দ্বারা বিভক্ত, যেকোন অবশিষ্টাংশ বাদ দিয়ে। উদাহরণস্বরূপ, 35
>> 2 এর মানে হল যে আমাদের 35 কে 2 দ্বারা দুইবার ভাগ করতে হবে, অবশিষ্ট
35/2 = 17 (বাকী 1 বাদ দিন) 17/2 = 8 (বাকী 1 বাদ দিন) শেষ পর্যন্ত, 35
>> 2 উচিত 8 এর সমান হবে। আসুন পরীক্ষা করা যাক:
public class Main {
public static void main(String[] args) {
System.out.println(35 >> 2);
}
}
কনসোল আউটপুট:
8
জাভাতে অপারেটরের অগ্রাধিকার
কোড লেখা এবং পড়ার সময়, আপনি প্রায়ই অভিব্যক্তি খুঁজে পাবেন যা বিভিন্ন ক্রিয়াকলাপকে একত্রিত করে। তারা যে আদেশে কার্যকর করা হবে তা বোঝা খুবই গুরুত্বপূর্ণ (অন্যথায়, আপনি ফলাফল দেখে অবাক হতে পারেন) কারণ জাভা-এর প্রচুর ক্রিয়াকলাপ রয়েছে, তাদের প্রত্যেককে একটি বিশেষ টেবিলে একটি স্থান নির্ধারণ করা হয়েছে:
অপারেটর অগ্রাধিকার
অপারেটর |
অগ্রাধিকার |
পোস্টফিক্স |
expr++ expr-- |
unary |
++expr --expr +expr ~ ! |
গুণক |
* / % |
সংযোজনকারী |
+ - |
স্থানান্তর |
<< >>>>> _ |
সম্পর্কীয় |
< > <= >= উদাহরণ |
সমতা |
== != |
bitwise এবং |
এবং |
bitwise একচেটিয়া OR |
^ |
বিটওয়াইজ ইনক্লুসিভ OR |
| |
যৌক্তিক এবং |
&& |
যৌক্তিক বা |
|| |
তিরনারি |
? : |
নিয়োগ |
= += -= *= /= %= &= ^= |= <<= >>= >>>= |
সমস্ত অপারেশন বাম থেকে ডানে সঞ্চালিত হয়, তাদের অগ্রাধিকার বিবেচনা করে। উদাহরণস্বরূপ, যদি আমরা লিখি
int x = 6 - 4/2;
তারপর প্রথমে ডিভিশন অপারেশন (
4/2 ) করা হবে। যদিও এটি দ্বিতীয় আসে, এটির প্রাধান্য বেশি। বন্ধনী এবং বন্ধনী সর্বাধিক অগ্রাধিকার নির্দেশ করে। স্কুলের কথাটা হয়তো তোমার মনে আছে। উদাহরণস্বরূপ, যদি আপনি তাদের অভিব্যক্তিতে যোগ করেন
int x = (6 - 4)/2;
তারপর বিয়োগটি প্রথমে সঞ্চালিত হয়, যেহেতু এটি বন্ধনীতে আবদ্ধ থাকে।
লজিক্যাল && অপারেটরের অগ্রাধিকার তুলনামূলকভাবে কম (সারণীটি দেখুন), তাই এটি সাধারণত শেষ হবে। উদাহরণ স্বরূপ:
boolean x = 6 - 4/2 > 3 && 12*12 <= 119;
এই অভিব্যক্তিটি নিম্নরূপ কার্যকর করা হবে:
boolean x = 6 - 2 > 3 && 12*12 <= 119;
boolean x = 6 - 2 > 3 && 144 <= 119;
boolean x = 4 > 3 && 144 <= 119;
এর পরে, তুলনা অপারেটরগুলি কার্যকর করা হয়:
boolean x = true && 144 <= 119;
boolean x = true && false;
![জাভা বিটওয়াইজ অপারেটর - 7]()
এবং, অবশেষে, AND অপারেটর (
&& ) শেষ পর্যন্ত কার্যকর করা হবে।
boolean x = true && false;
boolean x = false;
উদাহরণস্বরূপ, সংযোজন(
+ ) অপারেটরের != (সমান নয়) তুলনা অপারেটরের চেয়ে বেশি অগ্রাধিকার রয়েছে ; অতএব, অভিব্যক্তিতে
boolean x = 7 != 6+1;
6+1 অপারেশনটি প্রথমে সঞ্চালিত হবে, তারপর 7 != 7 চেক (যা মিথ্যাকে মূল্যায়ন করে), এবং সবশেষে ভেরিয়েবল x- এ ফলাফলের অ্যাসাইনমেন্ট (মিথ্যা) (সাধারণত সমস্ত অপারেটরের মধ্যে অ্যাসাইনমেন্টের সর্বনিম্ন অগ্রাধিকার থাকে; দেখুন টেবিল). উফফ! এটি একটি বিশাল পাঠ ছিল, কিন্তু আপনি এটি করেছেন! আপনি যদি এই বা আগের কিছু পাঠ সম্পূর্ণরূপে বুঝতে না পারেন, তাহলে চিন্তা করবেন না। আমরা ভবিষ্যতে একাধিকবার এই বিষয়গুলিতে স্পর্শ করব৷ যৌক্তিক এবং সংখ্যাসূচক ক্রিয়াকলাপ সম্পর্কে কোডজিমের কয়েকটি পাঠ। আমরা শীঘ্রই এগুলি পেতে পারব না, তবে এখন সেগুলি পড়তে আপনার কোনও ক্ষতি নেই।
GO TO FULL VERSION