উত্তর:
এগুলি হ'ল বিটওয়াইস এবং বিটওয়াইস বা অপারেটর।
int a = 6; // 110
int b = 4; // 100
// Bitwise AND
int c = a & b;
// 110
// & 100
// -----
// 100
// Bitwise OR
int d = a | b;
// 110
// | 100
// -----
// 110
System.out.println(c); // 4
System.out.println(d); // 6
জাভা ল্যাঙ্গুয়েজ স্পেসে ( 15.22.1 , 15.22.2) উপযুক্ত বিভাগটি নির্দেশ করার জন্য কার্লোসকে ধন্যবাদ এর ইনপুটগুলির উপর ভিত্তি করে অপারেটরের বিভিন্ন আচরণ সম্পর্কে ) ।
প্রকৃতপক্ষে যখন উভয় ইনপুটগুলি বুলিয়ান হয়, অপারেটরগুলি বুলিয়ান লজিকাল অপারেটর হিসাবে বিবেচিত হয় এবং শর্তাধীন-এবং ( &&
) এবং শর্তসাপেক্ষ-বা ( ||
) অপারেটরগুলির সাথে একই আচরণ করে তবে তারা শর্ট সার্কিট না করে থাকে তবে নিম্নলিখিতটি নিরাপদ থাকে :
if((a != null) && (a.something == 3)){
}
এটি হবে না:
if((a != null) & (a.something == 3)){
}
"শর্ট সার্কিট" অর্থ অপারেটর অগত্যা সমস্ত শর্ত পরীক্ষা করে না। উপরোক্ত উদাহরণগুলিতে, &&
দ্বিতীয় শর্তটি কেবল তখনই পরীক্ষা করবে যখন a
না হয় null
(অন্যথায় পুরো বিবৃতিটি মিথ্যা প্রত্যাবর্তন করবে এবং যে কোনও উপায়ে নিম্নলিখিত শর্তগুলি পরীক্ষা করা হবে), সুতরাং এর বিবৃতি a.something
ব্যতিক্রম বাড়াবে না, বা "নিরাপদ" হিসাবে বিবেচিত হবে । "
&
অপারেটর সবসময় দফা প্রতিটি শর্ত পরীক্ষা করে, তাই উপরের উদাহরণগুলোতে এ, a.something
মূল্যায়ন করা হতে পারে a
একটা সত্য হয় null
মান, একটি ব্যতিক্রম উত্থাপন।
আমি মনে করি আপনি উভয় অপারেটরের যৌক্তিক অর্থ সম্পর্কে কথা বলছেন, এখানে আপনার একটি টেবিল-জীবনবৃত্তান্ত রয়েছে:
boolean a, b;
Operation Meaning Note
--------- ------- ----
a && b logical AND short-circuiting
a || b logical OR short-circuiting
a & b boolean logical AND not short-circuiting
a | b boolean logical OR not short-circuiting
a ^ b boolean logical exclusive OR
!a logical NOT
short-circuiting (x != 0) && (1/x > 1) SAFE
not short-circuiting (x != 0) & (1/x > 1) NOT SAFE
শর্ট-সার্কিট মূল্যায়ন , ন্যূনতম মূল্যায়ন, বা ম্যাকার্থি মূল্যায়ন (জন ম্যাকার্থির পরে) কিছু প্রোগ্রামিং ভাষায় কিছু বুলিয়ান অপারেটরদের শব্দার্থবিজ্ঞান যেখানে দ্বিতীয় যুক্তিটি কার্যকর করা হয় বা মূল্যায়ন করা হয় কেবল যদি প্রথম যুক্তিটির মান নির্ধারণের জন্য যথেষ্ট না হয় অভিব্যক্তি: যখন অ্যান্ড ফাংশনটির প্রথম যুক্তিটি মিথ্যাতে মূল্যায়ন করে, সামগ্রিক মানটি অবশ্যই মিথ্যা হবে; এবং যখন ফাংশনটির প্রথম যুক্তিটি সত্যের কাছে মূল্যায়ন করে, সামগ্রিক মানটি অবশ্যই সত্য হয় be
নিরাপদ নয় মানে অপারেটর সর্বদা ধারাটির প্রতিটি শর্ত পরীক্ষা করে, সুতরাং উপরের উদাহরণগুলিতে 1 / এক্সকে মূল্যায়ন করা যেতে পারে যখন এক্স ব্যতীত, 0 মান হয়।
আমি জানি এখানে প্রচুর উত্তর রয়েছে তবে সেগুলি কিছুটা বিভ্রান্তিকর বলে মনে হচ্ছে। তাই জাভা ওরাকল স্টাডি গাইড থেকে কিছু গবেষণা করার পরে, আমি কখন && বা & ব্যবহার করতে হবে তার তিনটি ভিন্ন পরিস্থিতিতে নিয়ে এসেছি। তিনটি পরিস্থিতি হ'ল যৌক্তিক এবং , বিটওয়াইড এ্যান্ড , এবং বুলিয়ান অ্যান্ড ।
লজিকাল এবং:
লজিকাল অ্যান্ড (ওরফে শর্তসাপেক্ষে AND) && অপারেটর ব্যবহার করে । এটি স্বল্প সংকীর্ণ অর্থ: যদি বাম অপারেন্ডটি মিথ্যা হয় তবে ডান অপারেন্ডকে মূল্যায়ন করা হবে না।
উদাহরণ:
int x = 0;
if (false && (1 == ++x) {
System.out.println("Inside of if");
}
System.out.println(x); // "0"
উপরের উদাহরণে x এর কনসোলে মুদ্রিত মান 0 হবে, কারণ if স্টেটমেন্টের প্রথম অপারেন্ডটি মিথ্যা, সুতরাং জাভা গণনা করার প্রয়োজন নেই (1 == ++ x) সুতরাং এক্স গুণনা করা হবে না।
Bitwise এবং: bitwise ও ব্যবহার করে & অপারেটর। এটি মানটির উপরে বিটওয়াইজ অপারেশনটি ব্যবহার করতে ব্যবহৃত হয়। বাইনারি সংখ্যার অপারেশন দেখে কী চলছে তা দেখতে অনেক সহজ:
int a = 5; // 5 in binary is 0101
int b = 12; // 12 in binary is 1100
int c = a & b; // bitwise & preformed on a and b is 0100 which is 4
উদাহরণস্বরূপ আপনি দেখতে পাচ্ছেন, যখন 5 এবং 12 সংখ্যার বাইনারি উপস্থাপনাগুলি রেখাযুক্ত থাকে, তখন কিছুটা বিস্মৃত হয় এবং পূর্বনির্ধারিত কেবল একটি বাইনারি সংখ্যা তৈরি করে যেখানে উভয় সংখ্যার একই অঙ্কের 1 থাকে। সুতরাং 0101 এবং 1100 == 0100. দশমিক কোনটি 5 এবং 12 == 4।
বুলিয়ান এবং: এখন বুলিয়ান এবং অপারেটর বিটওয়াইজ এবং লজিক্যাল এবং উভয়ই একইরকম এবং ভিন্নভাবে আচরণ করে। আমি এটিকে কিছুটা দিকনির্দেশনা হিসাবে এবং দুটি বুলিয়ান মান (বা বিট) এর মধ্যে হিসাবে বিবেচনা করতে চাই, সুতরাং এটি & অপারেটর ব্যবহার করে । বুলিয়ান মানগুলি একটি যৌক্তিক অভিব্যক্তির ফলাফলও হতে পারে।
এটি সত্যিকারের বা মিথ্যা মানটি দেয় অনেকটা যৌক্তিক AND এর মতো, তবে যৌক্তিক এবং এর বিপরীতে এটি সংক্ষিপ্ত প্রচারিত হয় না। কারণটির কারণটি হ'ল এটি যে বিটওয়াইস এবং পূর্বনির্ধারিত করার জন্য, এটি অবশ্যই বাম এবং ডান উভয় ক্রিয়াকলাপের মান জানতে হবে। এখানে প্রাক্তন:
int x = 0;
if (false & (1 == ++x) {
System.out.println("Inside of if");
}
System.out.println(x); //"1"
এখন যখন স্টেটমেন্টটি চালানো হয় তখন বাম অপারেন্ডটি মিথ্যা হলেও অভিব্যক্তি (1 == ++ x) কার্যকর করা হবে। সুতরাং এক্স এর জন্য মুদ্রিত মানটি 1 হবে কারণ এটি বৃদ্ধি পেয়েছে।
এটি লজিক্যাল ওআর (||), বিটওয়াইস ওআর (|) এবং বুলিয়ান ওআর (|) এর ক্ষেত্রেও প্রযোজ্য আশা করি এটি কিছু বিভ্রান্তি দূর করে।
to preform that bitwise AND, it must know the value of both left and right operands
এটি আমার কাছে ঠিক শোনাচ্ছে না। একটি সম্পাদন করার জন্য BITWISE AND
আপনাকে বাম অপারেন্ড হলে ফলাফলটি বের করতে সক্ষম হতে ডান অপারেণ্ড জানতে হবে না FALSE
। আপনি যা ব্যাখ্যা করেছেন তা সঠিক, তবে আপনি যে যুক্তিটি বলেছেন তা কমপক্ষে আমার কাছে মনে হয় না
অপারেটরগুলি && এবং || শর্ট সার্কিট হচ্ছে, যার অর্থ ফলাফল নির্ধারণের জন্য বাম-হাতের অভিব্যক্তির মান যথেষ্ট হলে তারা তাদের ডান হাতের অভিব্যক্তিটি মূল্যায়ন করবে না।
এবং এবং | &&& এর মতো একই ফলাফল সরবরাহ করে অপারেটর। পার্থক্যটি হ'ল তারা সর্বদা প্রকাশের উভয় দিকই মূল্যায়ন করে যেখানে && এবং || প্রথম শর্তটি ফলাফল নির্ধারণের জন্য পর্যাপ্ত কিনা তা মূল্যায়ন করা বন্ধ করুন।
&&
এটি উভয় ফলাফলকে মূল্যায়ন করে যখন ||
প্রথম শর্তটি সত্য হলে কেবল ফেরত দেয়।
( 2 & 4 )
মূল্যায়ন false
, যেখানে ( 2 && 4 )
মূল্যায়ন true
। ঠিক কীভাবে একই ফলাফল?
2 & 4
একটি পূর্ণসংখ্যার ফলাফল, একটি বুলিয়ান নয় (এক্ষেত্রে শূন্য)। 2 && 4
সংকলন করবে না, && কেবল বুলেটগুলি গ্রহণ করবে। জাভা বুলেট এবং অন্তর্নিহিত মিশ্রণের অনুমতি দেয় না: শূন্য নয় false
, false
শূন্য নয় ...
&&
এটি শুধুমাত্র দ্বিতীয় প্রতীক মূল্যায়ণ যদি প্রথম প্রতীক হয় true
।
জাভাতে, একক অপারেটরগুলি &; |, ^,! অপারেশন উপর নির্ভর করে। যদি উভয় অপারেন্ডগুলি ইনট হয় তবে একটি বিটওয়াস অপারেশন করা হয়। যদি উভয়ই বুলিয়ান হয় তবে একটি "লজিকাল" অপারেশন করা হয়।
উভয় অপারেশন মিল না থাকলে একটি সংকলন সময় ত্রুটি নিক্ষেপ করা হয়।
ডাবল অপারেটর &&, || তাদের একক অংশগুলির সাথে একইরকম আচরণ করুন, তবে উভয় অপারেশন অবশ্যই শর্তযুক্ত অভিব্যক্তি হতে হবে, উদাহরণস্বরূপ:
যদি ((a <0) && (খ <0)) {...} বা একইভাবে, যদি ((a <0) || (খ <0)) {...}
উত্স: জাভা প্রোগ্রামিং ল্যাং 4 র্থ সংস্করণ
&
এবং |
অবিচ্ছেদ্য ধরনের bitwise অপারেটরদের (যেমন হয় int
): http://download.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
&&
এবং ||
কেবল বুলিয়ানগুলিতে পরিচালনা করুন (এবং শর্ট সার্কিট, যেমন অন্যান্য উত্তর ইতিমধ্যে বলেছে)।
&
এবং |
বুলিয়ান প্রকারের বুলিয়ান অপারেটরগুলিও।
সম্ভবত এটি জেনে রাখা দরকারী যে বিটওয়াইস এবং বিটওয়াইজ বা অপারেটরগুলি সর্বদা শর্তসাপেক্ষে এবং শর্তসাপেক্ষে একই অভিব্যক্তিতে ব্যবহৃত হওয়ার আগে মূল্যায়ন করা হয়।
if ( (1>2) && (2>1) | true) // false!
&&; || লজিকাল অপারেটরগুলি .... শর্ট সার্কিট
&; | বুলিয়ান লজিকাল অপারেটরগুলি .... নন-শর্ট সার্কিট
অভিব্যক্তিগুলিতে মৃত্যুদণ্ড কার্যকর করার ক্ষেত্রে পার্থক্যে চলে যাওয়া। বিটওয়াইজ অপারেটরগুলি বাম দিকের ফলাফল নির্বিশেষে উভয় পক্ষকে মূল্যায়ন করে। লজিকাল অপারেটরগুলির সাথে এক্সপ্রেশন মূল্যায়নের ক্ষেত্রে ডান হাতের অভিব্যক্তিটির মূল্যায়ন বাম হাতের অবস্থার উপর নির্ভরশীল।
উদাহরণ স্বরূপ:
int i = 25;
int j = 25;
if(i++ < 0 && j++ > 0)
System.out.println("OK");
System.out.printf("i = %d ; j = %d",i,j);
এটি i = 26 মুদ্রণ করবে; j = 25, প্রথম শর্তটি মিথ্যা হওয়ায় ডান হাতের শর্তটি বাইপাস করা হয় কারণ ডান হাতের অবস্থা নির্বিশেষে ফলজ যাই হোক না কেন মিথ্যা। (শর্ট সার্কিট)
int i = 25;
int j = 25;
if(i++ < 0 & j++ > 0)
System.out.println("OK");
System.out.printf("i = %d ; j = %d",i,j);
তবে, এটি i = 26 মুদ্রণ করবে; ঞ = 26,
যদি বুলিয়ান এবং অপারেটরের সাথে জড়িত কোনও অভিব্যক্তি মূল্যায়ন করা হয় তবে উভয় অপারেশনকে মূল্যায়ন করা হবে। তারপরে অপারেটরটি অপারেন্ডে প্রয়োগ করা হয়।
যখন && অপারেটর জড়িত একটি অভিব্যক্তি মূল্যায়ন করা হয়, প্রথম অপারেন্ড মূল্যায়ন করা হয়। প্রথম অপারেন্ডটি যদি মিথ্যা হিসাবে মূল্যায়ন করে তবে দ্বিতীয় অপারেন্ডের মূল্যায়ন এড়িয়ে যায়।
প্রথম অপারেন্ড যদি সত্যের মান দেয় তবে দ্বিতীয় অপারেন্ডকে মূল্যায়ন করা হয়। দ্বিতীয় অপারেন্ড যদি সত্যের মান দেয় তবে && অপারেটরটি প্রথম এবং দ্বিতীয় অপারেন্ডগুলিতে প্রয়োগ করা হয়।
জন্য অনুরূপ এবং ||
যদিও মূল পার্থক্যটি এটি &
বেশিরভাগ বিটওয়াইজ অপারেশনের জন্য ব্যবহৃত হয় long
, int
বা byte
যেখানে এটি কোনও মুখোশের ধরণের জন্য ব্যবহার করা যেতে পারে, আপনি যুক্তিযুক্ত পরিবর্তে এটি ব্যবহার করলেও ফলাফলগুলি পৃথক হতে পারে &&
।
কিছু পরিস্থিতিতে পার্থক্যটি আরও লক্ষণীয়:
প্রথম পয়েন্টটি বেশ সোজা, এটি কোনও বাগের কারণ নয়, তবে এটি আরও বেশি সময় নেয়। একটি শর্তাধীন বিবৃতিতে আপনার যদি বেশ কয়েকটি পৃথক চেক থাকে তবে তা সস্তার বা বামে ব্যর্থ হওয়ার সম্ভাবনা বেশি রাখুন।
দ্বিতীয় দফার জন্য, এই উদাহরণটি দেখুন:
if ((a != null) & (a.isEmpty()))
এটি ব্যর্থ হয় null
, হিসাবে দ্বিতীয় এক্সপ্রেশন মূল্যায়নের একটি NullPointerException
। লজিকাল অপারেটর &&
অলস, যদি বাম অপারেন্ডটি মিথ্যা হয় তবে ডান অপারেন্ডটি যাই হোক না কেন ফলটি মিথ্যা।
তৃতীয় দফার উদাহরণ - ধরা যাক আমাদের কাছে এমন একটি অ্যাপ রয়েছে যা কোনও ট্রিগার বা ক্যাসকেড ছাড়াই ডিবি ব্যবহার করে। আমরা কোনও বিল্ডিং অবজেক্ট সরানোর আগে আমাদের অবশ্যই বিভাগীয় অবজেক্টের বিল্ডিংটিকে অন্য একটিতে পরিবর্তন করতে হবে। চলুন এটিও বলি যে অপারেশন স্থিতিটি বুলিয়ান (সত্য = সাফল্য) হিসাবে ফিরে আসে। তারপর:
if (departmentDao.update(department, newBuilding) & buildingDao.remove(building))
এটি উভয় অভিব্যক্তিকে মূল্যায়ন করে এবং এভাবে বিল্ডিং অপসারণ কার্য সম্পাদন করে এমনকি বিভাগের আপডেট কোনও কারণে ব্যর্থ হলে। সহ &&
, এটি ইচ্ছাকৃত হিসাবে কাজ করে এবং এটি প্রথম ব্যর্থতার পরে বন্ধ হয়ে যায়।
হিসাবে a || b
এটি সমতুল্য !(!a && !b)
, এটি যদি a
সত্য হয় তবে এটি বন্ধ হয়ে যায়, আর কোনও ব্যাখ্যাের প্রয়োজন নেই।