লজিকাল অপারেটর ( ||
এবং &&
) বনাম বিটওয়াইড অপারেটর ( |
এবং &
)।
লজিকাল অপারেটর এবং বিটওয়াইস অপারেটরের মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্যটি হ'ল লজিকাল অপারেটর দুটি বুলিয়ান গ্রহণ করে এবং একটি বুলিয়ান উত্পাদন করে যখন বিটওয়াইজ অপারেটর দুটি পূর্ণসংখ্যক গ্রহণ করে এবং একটি পূর্ণসংখ্যার উত্পাদন করে (দ্রষ্টব্য: পূর্ণসংখ্যার অর্থ কোনও ইনট্রিগাল ডেটা টাইপ, কেবল ইনট নয়)।
পেডেন্টিক হওয়ার জন্য, বিটওয়াস অপারেটর একটি বিট-প্যাটার্ন নেয় (উদাহরণস্বরূপ 01101011) এবং প্রতিটি বিটগুলিতে কিছুটা বুদ্ধিমান ও / অথবা করে। সুতরাং, উদাহরণস্বরূপ আপনার যদি দুটি 8-বিট পূর্ণসংখ্যা থাকে:
a = 00110010 (in decimal: 32+16+2 = 50)
b = 01010011 (in decimal: 64+ 16+2+1 = 83)
----------------
a & b = 00010010 (in decimal: 16+2 = 18)
a | b = 01110011 (in decimal: 64+32+16+2+1 = 115)
যখন একটি লজিকাল অপারেটর কেবল এতে কাজ করে bool
:
a = true
b = false
--------------
a && b = false
a || b = true
দ্বিতীয়ত, বুলের উপরে বিটওয়াস অপারেটর ব্যবহার করা প্রায়শই সম্ভব যেহেতু সত্য এবং মিথ্যা যথাক্রমে 1 এবং 0 এর সমান হয়, এবং এমনটি ঘটে যে আপনি যদি 1 এর সাথে সত্য এবং ভুলটিকে 0 তে অনুবাদ করেন তবে বিটওয়াইজ অপারেশন করুন, তারপরে অ-শূন্য রূপান্তর করুন if সত্য থেকে মিথ্যা এবং শূন্য থেকে মিথ্যা; এটি ঘটে যে আপনি যদি কেবলমাত্র লজিকাল অপারেটর ব্যবহার করেন (ব্যায়ামের জন্য এটি পরীক্ষা করে দেখুন) ফলাফলটি একই হবে।
আরেকটি গুরুত্বপূর্ণ পার্থক্যটি হ'ল লজিকাল অপারেটরটি স্বল্প-প্রচারিত হয় । সুতরাং, কিছু চেনাশোনাতে [1], আপনি প্রায়শই লোককে এই জাতীয় কিছু করতে দেখেন:
if (person && person.punch()) {
person.doVictoryDance()
}
যা অনুবাদ করে: "যদি ব্যক্তি উপস্থিত থাকে (যেমন নাল নয়) তবে তাকে ঘুষি দেওয়ার চেষ্টা করুন, এবং যদি পাঞ্চ সফল হয় (যেমন সত্য ফিরে আসে), তবে বিজয় নৃত্য করুন" ।
আপনি যদি এর পরিবর্তে খানিকটা অপারেটর ব্যবহার করেন তবে এটি:
if (person & person.punch()) {
person.doVictoryDance()
}
অনুবাদ করবে: "যদি ব্যক্তি উপস্থিত থাকে (যেমন নাল নয়) এবং পাঞ্চ সফল হয় (যেমন সত্য ফিরে আসে), তবে বিজয় নৃত্য করুন" ।
দ্রষ্টব্য যে সংক্ষিপ্ত-প্রচারিত লজিকাল অপারেটরে, person.punch()
কোডটি নালার পরে চালানো যাবে না person
। প্রকৃতপক্ষে, এই বিশেষ ক্ষেত্রে, দ্বিতীয় কোডটি যদি person
নাল হয় তবে একটি নাল রেফারেন্স ত্রুটি তৈরি করে , যেহেতু এটি person.punch()
ব্যক্তি নাল হোক না কেন তা কল করার চেষ্টা করে না। ডান অপারেণ্ডকে মূল্যায়ন না করার এই আচরণকে শর্ট সার্কিট বলে ।
[1] কিছু প্রোগ্রামার একটি ফাংশন কল রাখার জন্য বাউলক করবে যা একটি if
অভিব্যক্তির অভ্যন্তরে পার্শ্ব প্রতিক্রিয়া রাখে , অন্যদের জন্য এটি একটি সাধারণ এবং খুব দরকারী বুদ্ধিমান।
যেহেতু বিটওয়াইজ অপারেটর একসাথে 32-বিটগুলিতে কাজ করে (যদি আপনি 32-বিট মেশিনে থাকেন), তবে আপনাকে যদি বিপুল সংখ্যক শর্তের তুলনা করার প্রয়োজন হয় তবে এটি আরও মার্জিত এবং দ্রুত কোডের দিকে নিয়ে যেতে পারে eg
int CAN_PUNCH = 1 << 0, CAN_KICK = 1 << 1, CAN_DRINK = 1 << 2, CAN_SIT = 1 << 3,
CAN_SHOOT_GUNS = 1 << 4, CAN_TALK = 1 << 5, CAN_SHOOT_CANNONS = 1 << 6;
Person person;
person.abilities = CAN_PUNCH | CAN_KICK | CAN_DRINK | CAN_SIT | CAN_SHOOT_GUNS;
Place bar;
bar.rules = CAN_DRINK | CAN_SIT | CAN_TALK;
Place military;
military.rules = CAN_SHOOT_CANNONS | CAN_PUNCH | CAN_KICK | CAN_SHOOT_GUNS | CAN_SIT;
CurrentLocation cloc1, cloc2;
cloc1.usable_abilities = person_abilities & bar_rules;
cloc2.usable_abilities = person_abilities & military_rules;
// cloc1.usable_abilities will contain the bit pattern that matches `CAN_DRINK | CAN_SIT`
// while cloc2.usable_abilities will contain the bit pattern that matches `CAN_PUNCH | CAN_KICK | CAN_SHOOT_GUNS | CAN_SIT`
লজিকাল অপারেটরগুলির সাথে এটি করার জন্য একটি বিশ্রী পরিমাণের তুলনা প্রয়োজন:
Person person;
person.can_punch = person.can_kick = person.can_drink = person.can_sit = person.can_shoot_guns = true;
person.can_shoot_cannons = false;
Place bar;
bar.rules.can_drink = bar.rules.can_sit = bar.rules.can_talk = true;
bar.rules.can_punch = bar.rules.can_kick = bar.rules.can_shoot_guns = bar.rules.can_shoot_cannons = false;
Place military;
military.rules.can_punch = military.rules.can_kick = military.rules.can_shoot_guns = military.rules.can_shoot_cannons = military.rules.can_sit = true;
military.rules.can_drink = military.rules.can_talk = false;
CurrentLocation cloc1;
bool cloc1.usable_abilities.can_punch = bar.rules.can_punch && person.can_punch,
cloc1.usable_abilities.can_kick = bar.rules.can_kick && person.can_kick,
cloc1.usable_abilities.can_drink = bar.rules.can_drink && person.can_drink,
cloc1.usable_abilities.can_sit = bar.rules.can_sit && person.can_sit,
cloc1.usable_abilities.can_shoot_guns = bar.rules.can_shoot_guns && person.can_shoot_guns,
cloc1.usable_abilities.can_shoot_cannons = bar.rules.can_shoot_cannons && person.can_shoot_cannons
cloc1.usable_abilities.can_talk = bar.rules.can_talk && person.can_talk;
bool cloc2.usable_abilities.can_punch = military.rules.can_punch && person.can_punch,
cloc2.usable_abilities.can_kick = military.rules.can_kick && person.can_kick,
cloc2.usable_abilities.can_drink = military.rules.can_drink && person.can_drink,
cloc2.usable_abilities.can_sit = military.rules.can_sit && person.can_sit,
cloc2.usable_abilities.can_shoot_guns = military.rules.can_shoot_guns && person.can_shoot_guns,
cloc2.usable_abilities.can_talk = military.rules.can_talk && person.can_talk,
cloc2.usable_abilities.can_shoot_cannons = military.rules.can_shoot_cannons && person.can_shoot_cannons;
একটি শাস্ত্রীয় উদাহরণ যেখানে বিট-প্যাটার্নস এবং বিটওয়াইস অপারেটর ব্যবহৃত হয় তা ইউনিক্স / লিনাক্স ফাইল সিস্টেম অনুমতিগুলির মধ্যে।