জাভাতে একটি "লজিকাল এক্সক্লুসিভ বা" অপারেটর তৈরি করা


274

পর্যবেক্ষণ:

জাভাতে একটি লজিকাল এবং অপারেটর রয়েছে।
জাভাতে একটি লজিকাল ওআর অপারেটর রয়েছে।
জাভাতে একটি লজিকাল নট অপারেটর রয়েছে।

সমস্যা:

সূর্য অনুসারে জাভাতে কোনও লজিকাল এক্সওআর অপারেটর নেই । আমি একটি সংজ্ঞায়িত করতে চাই

পদ্ধতির সংজ্ঞা:

একটি পদ্ধতি হিসাবে এটি কেবল নীচে হিসাবে সংজ্ঞায়িত করা হয়:

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}


পদ্ধতি কল:

এই পদ্ধতিটি নিম্নলিখিত পদ্ধতিতে বলা হয়:

boolean myVal = logicalXOR(x, y);


অপারেটরের ব্যবহার:

আমার পরিবর্তে নিম্নলিখিত হিসাবে ব্যবহৃত একটি অপারেটর চাই:

boolean myVal = x ^^ y;


প্রশ্ন:

জাভাতে নতুন অপারেটর কীভাবে সংজ্ঞায়িত করতে হবে সে সম্পর্কে আমি কিছুই খুঁজে পাচ্ছি না। কোথায় শুরু করব?


1
কি? আপনি যে লিঙ্কটি দিয়েছেন তাতে লিখিত সামগ্রীটি 'বিটওয়াইজ এক্সক্লুসিভ ওআর' রয়েছে
ম্যাথিউ পি। জোন্স

আপনি কি তখন ভাবছিলেন যে আপনি যদি জাভাতে অপারেটরগুলি যেমন সি ++ তে করতে পারেন তেমন সংজ্ঞা দিতে পারেন?
avgvstvs

1
দেখে মনে হচ্ছে আপনি এবং && এর মধ্যে পার্থক্যটি ভুল বুঝেছেন। উভয়ই লজিকাল অপারেটর (একটি বুলিয়ান)। স্টারব্লু এর উত্তর এটিকে আরও বিস্তৃত করে।
ভ্লাস্যাক

এটি টিউটোরিয়ালে না থাকার কারণে , জাভাতে এটি নেই তা নয় - টিউটোরিয়ালগুলি (সর্বদা) সম্পূর্ণ হয় না। দেখুন জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন 15.22.2
user85421

5
এটি বলা হয় !=, এখানে একটি যৌক্তিক এক্সএনওআরও রয়েছে==
মার্ক কে

উত্তর:


695

জাভাতে একটি লজিকাল এক্সওআর অপারেটর রয়েছে , এটি ^ (যেমন রয়েছে a ^ b)।

তা ছাড়া, আপনি জাভাতে নতুন অপারেটরগুলি সংজ্ঞায়িত করতে পারবেন না।

সম্পাদনা করুন: এখানে একটি উদাহরণ রয়েছে:

public static void main(String[] args) {
    boolean[] all = { false, true };
    for (boolean a : all) {
        for (boolean b: all) {
            boolean c = a ^ b;
            System.out.println(a + " ^ " + b + " = " + c);
        }
    }
}

আউটপুট:

মিথ্যা ^ মিথ্যা = মিথ্যা
মিথ্যা ^ সত্য = সত্য
সত্য ^ মিথ্যা = সত্য
true ^ true = false

5
আমি যখন আমার পোস্টটি লিখেছিলাম তখন এটি আমার স্মৃতি থেকেও রক্ষা পেয়েছিল তবে আমি মনে করি আপনি লজিকাল অপারেটর হিসাবে (পাশাপাশি বিটওয়াইস) ব্যবহার করতে পারেন।
নীল কফফি

144
কেবল বিটওয়াইজ অপারেটরই নয়। এটি লজিকাল অপারেটরও। ^ অপারেটর ওভারলোড হয়েছে। এটি ইন্টিগ্রাল টাইপ বা বুলিয়ান টাইপগুলিতে পরিচালনা করে। দুর্দান্ত উত্তর জাভাসলুকের জন্য +1। এডি, এটি জেএলএস বিভাগ 15.22.2, "বুলিয়ান লজিকাল অপারেটর &, ^, এবং |" এর চেয়ে বেশি স্পষ্ট করে না।
এরিকসন

97
এবং অবশ্যই, উত্তরটি এটি && এবং || এক্সপ্রেশন এবং & এবং এর দ্বিতীয় অংশের মূল্যায়ন এড়িয়ে যাবে সর্বদা অভিব্যক্তির উভয় অংশের মূল্যায়ন করবে (আমার জেএলএসের পাঠ থেকে)। একটি ^^ সবসময় সংজ্ঞা অনুসারে উভয় অংশের মূল্যায়ন করতে হবে, তাই ident এর সাথে অভিন্ন আচরণ করে ^ সম্ভবত কেন কোনও ^^ নেই
এডি

81
@ এডি: এটি এবং ^^ দেখতে অনেকটা ইমোটিকনের মতোই লাগে।
মাইকেল ময়র্স

5
সম্ভবত এটি শব্দার্থবিজ্ঞানের বিষয়, তবে এটি এক্সওআর এর ক্ষেত্রে, বিটওয়াইজ এবং লজিক্যাল ফলন একই ফলাফল। অতএব, স্বতন্ত্র অপারেটরগুলির প্রয়োজন নেই। এক্সওআর অপারেটরের জন্য সরলীকৃত সত্য টেবিলটি হ'ল এক্স X! এক্স = ১। আপনি এক্সওআর-এ কোনও ইনপুট শর্ট সার্কিট করতে পারবেন না কারণ আপনাকে ইনপুটগুলি আলাদা কিনা তা নির্ধারণ করতে হবে। আপনি যদি সত্যিকারের এক্সওআর গেটের বানোয়াট জানেন তবে এটি বোঝা অনেক সহজ।
hfontanez

305

এটি x! = Y নয়?


5
যদি এক্স এবং ওয়াই বুলিয়ান হয় তবে xor এবং! = এর জন্য যুক্তি সারণী একরকম: t, t => f; t, f => t; f, t => t; f, f => f
গ্রেগ কেস

81
মরিস: আরেগ আপনি সবে আমার মন উড়িয়ে দিয়েছেন! আমি কখনই এটি লক্ষ্য করিনি?

8
@ মিলহৌস আপনি কি বলছেন a != b != cকাজ করবে না, তবে a ^ b ^ cহবে? সেক্ষেত্রে আপনারা ভুল করছেন
ফ্রেডওভারফ্লো

3
মরিস, শুধু উজ্জ্বল! যখন অনেক কিছু করার দরকার হয় তখন দৃষ্টিশক্তি থেকে সাধারণ জিনিস হারাতে আমার মনে হয় :)
sberezin

6
এই approch implodes যখন উভয় পক্ষের রাপার শ্রেনীর হয়, new Boolean(true) != new Boolean(true)দেয় true
ভ্লাস্টিমিল ওভেক

74

জাভাতে একটি লজিকাল এবং অপারেটর রয়েছে।
জাভাতে একটি লজিকাল ওআর অপারেটর রয়েছে।

ভুল।

জাভা আছে

  • দুটি লজিকাল এবং অপারেটর: স্বাভাবিক এবং হয় এবং এবং শর্ট সার্কিট এবং হয় &&, এবং
  • দুটি লজিকাল ওআর অপারেটর: সাধারণ ওআর হয় এবং শর্ট সার্কিট OR হয় ||

এক্সওআরটি কেবলমাত্র ^ হিসাবে বিদ্যমান, কারণ শর্ট সার্কিট মূল্যায়ন সম্ভব নয়।


2
আকর্ষণীয় মন্তব্য। তা কি নথিভুক্ত?
ব্যবহারকারী 666412

1
আমি মনে করি & এবং | তারা শর্ট সার্কিট নয় কারণ তারা বিটওয়াইড অপারেটর। এবং বাস্তবে এগুলি শর্ট সার্কিট করা সম্ভব নয়।
ক্রিজিসটফ জাবোসস্কি

3
@ ক্রিজিসটফ জাবোওস্কি তারা সংখ্যায় বিটওয়াইজ অপারেটর, তবে এখানে আমরা বুলিয়ান এক্সপ্রেশন নিয়ে কথা বলছি।
স্টার ব্লু

3
@ ব্যবহারকারী 666412 হ্যাঁ, জাভা ভাষা নির্দিষ্টকরণে (অন্য কোথা?) in
স্টার ব্লু

18
যদি এটিতে 2 ও এন্ড অপারেটর এবং 2 ওআর অপারেটর থাকে তবে 'জাভাতে একটি লজিকাল অ্যান্ড অপারেটর রয়েছে' এবং 'জাভাতে একটি লজিকাল ওআর অপারেটর রয়েছে' উক্তিটি ভুল নয়। সংজ্ঞা অনুসারে যদি আপনার কাছে 2 টি থাকে তবে আপনার এটির 1 টিও রয়েছে।
রায়ানফায়েস্কটল্যান্ড

31

সম্ভবত আপনি মধ্যে পার্থক্য অনেকেই ভুল বুঝে ভাবেন &এবং &&, |এবং || শর্টকাট অপারেটরদের উদ্দেশ্যে &&এবং ||যে প্রথম প্রতীক মান ফলাফলের নির্ধারণ করতে পারেন এবং তাই দ্বিতীয় প্রতীক মূল্যায়ন করা প্রয়োজন না।

এটি বিশেষত কার্যকর যদি দ্বিতীয় অপারেন্ডের একটি ত্রুটির ফলাফল হয়। যেমন

if (set == null || set.isEmpty())
// or
if (list != null && list.size() > 0)

তবে এক্সওআর দিয়ে , ফলাফলটি পেতে আপনাকে সর্বদা দ্বিতীয় অপারেন্ডকে মূল্যায়ন করতে হয় তাই একমাত্র অর্থবহ অপারেশন ^


20

আপনি শুধু লিখতে পারেন (a!=b)

এটি যেমনভাবে কাজ করবে a ^ b


9

এর কারণ অপারেটর ওভারলোডিং এমন একটি জিনিস যা তারা বিশেষত ইচ্ছাকৃতভাবে ভাষা থেকে বেরিয়ে আসে। তারা স্ট্রিং কনটেনটেশন দিয়ে কিছুটা "প্রতারণা" করেছে তবে এর বাইরেও এ জাতীয় কার্যকারিতা বিদ্যমান নেই।

(অস্বীকৃতি: আমি জাভা প্রকাশের সর্বশেষ 2 টি বড় রিলিজের সাথে কাজ করি নি, তাই এখন যদি এটি হয় তবে আমি খুব অবাক হব)


5
মনে রাখবেন যে আপনি সি ++ তে নতুন অপারেটরগুলি সংজ্ঞায়িত করতে পারবেন না। আপনি যা করতে পারেন তা পুরানোগুলিকে নতুন অর্থ প্রদান করা give
ডেভিড থর্নলি

7

জাভাতে একমাত্র অপারেটর ওভারলোডিং + অন স্ট্রিংস ( জেএলএস 15.18.1 স্ট্রিং কনক্যাটেনশন অপারেটর + )।

সম্প্রদায়টি 3 বছর ধরে বিভক্ত হয়েছে, 1/3 এটি চায় না, 1/3 এটি চায়, এবং 1/3 যত্ন করে না।

আপনি ইউনিকোড ব্যবহার করতে পারেন এমন নামের নামগুলি তৈরি করতে যা প্রতীক ... তাই আপনার যদি একটি প্রতীক থাকে আপনি ব্যবহার করতে চান আপনি মাইভাল = এক্স করতে পারেন $ (y); যেখানে the প্রতীক এবং x কোনও আদিম নয় ... তবে এটি কিছু সম্পাদকের মধ্যে দুষ্টু হতে চলেছে এবং এটি সীমাবদ্ধ করছে যেহেতু আপনি এটি কোনও আদিম হিসাবে এটি করতে পারবেন না।


7

নিম্নলিখিত আপনার কোড:

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}

অতিশয় হয়।

কেন লিখবেন না:

public static boolean logicalXOR(boolean x, boolean y) {
    return x != y;
}

?

জাভাশলুক যেমন বলেছে , সেখানে ইতিমধ্যে ^অপারেটর রয়েছে।

!=এবং ^বুলিয়ান অপারেন্ডস (আপনার কেস) এর জন্য অভিন্নভাবে কাজ করুন, তবে পূর্ণসংখ্যার অপারেন্ডগুলির জন্য আলাদা।

* দ্রষ্টব্য:
১. এগুলি boolean(আদিম ধরণের) জন্য অভিন্নভাবে কাজ করে , তবে Boolean(অবজেক্টের ধরণ) অপারেশনগুলিতে নয়। যেমন Boolean(অবজেক্ট টাইপ) মানগুলির মান থাকতে পারে null। এবং !=ফিরে আসবে falseবা trueযখন এর দুটি বা দুটি অপারেশন থাকবে null, যখন এই ক্ষেত্রে ^ছুঁড়ে ফেলা হবে NullPointerException
২. যদিও তারা অভিন্নভাবে কাজ করে, তাদের আলাদা নজির রয়েছে, উদাহরণস্বরূপ: যখন এটি ব্যবহার করা হয় &: a & b != c & dহিসাবে বিবেচিত হবে a & (b != c) & d, যখন হিসাবে a & b ^ c & dবিবেচিত হবে (a & b) ^ (c & d)(অফটোপিক: আউচ, সি-স্টাইলের অগ্রাধিকার টেবিল চুষতে হবে)।


1
বুলিয়ান মানগুলির জন্য আমি পছন্দ করি!=
GKalnytskyi

1
@GKalnytskyi Booleanমানগুলির জন্য !=ভুলভাবে কাজ করে। জন্য booleanমান এটা ঠিক আছে।
ভাদপ্প

2
! = এবং boo বুলিয়ান অপারেন্ডগুলির জন্য অভিন্নভাবে কাজ করে না । অগ্রাধিকারের কারণে আপনি "মিথ্যা ও মিথ্যা! = সত্য" বনাম "মিথ্যা ও মিথ্যা-সত্য" এর জন্য আলাদা ফলাফল পাবেন।
অ্যালবার্ট হেন্ডরিক্স

1
অ্যালবার্টহেন্দ্রিক্স, আমি আরও ভাল করে বলতে পারি যে তারা অভিন্ন কাজ করে তবে তাদের আলাদা নজির রয়েছে (যদিও এটি কেবলমাত্র পরিভাষার বিষয়)।
সাশা

6

জাভা জন্য এখানে একটি var আরগ XOR পদ্ধতি ...

public static boolean XOR(boolean... args) {
  boolean r = false;
  for (boolean b : args) {
    r = r ^ b;
  }
  return r;
}

উপভোগ করুন


এটির মতো মনে হচ্ছে এটির কিছু খুব অদ্ভুত আচরণ হবে। যেমন XOR(true,true,true)সত্য ফেরৎ, যা আপনি একটি পদ্ধতি বলা থেকে আশা করতে চাই কি মত নয় বলে মনে হয় XOR। আমার প্রত্যাশিত আচরণটি হ'ল এটি সর্বদা মিথ্যা প্রত্যাবর্তন করে (যা অবশ্যই সহায়ক নয়)
রিচার্ড টিংল

4

যৌক্তিক একচেটিয়া বা জাভা বলা হয় !=। আপনি ^যদি আপনার বন্ধুদের বিভ্রান্ত করতে চান তবে আপনি এটিও ব্যবহার করতে পারেন।


2

ওভারলোড অপারেটরদের জন্য আপনি জাভাতে (ইনফিক্স অপারেটর এবং অপারেটর ওভারলোডিং ) এবং জাভাতে 'থাকুন' ব্যবহার করতে পারেন


নোট করুন যে এক্সএন্ডেট আপনাকে ক্যারেটকে ওভাররাইড করার অনুমতি দেয় না ^; আপনি ব্যবহার করা আবশ্যক bool_1.xor(bool_2)। অদ্ভুতভাবে, পার্সার এমনকি আপনাকে ক্যারেট ব্যবহার করতে দেয় না ; আপনাকে অবশ্যই xorবুলিয়ান এবং bitwiseXorপূর্ণসংখ্যার জন্য ব্যবহার করতে হবে । আপনি অবশ্যই অন্য অপারেটরটিকে ওভারলোড করতে পারেন তবে এটি খুব বিভ্রান্তিকর হবে।
কেলভিন

2

আপনি যা জিজ্ঞাসা করছেন তা খুব একটা বোঝায় না। আমি ভুল না হলে আপনি প্রস্তাব দিচ্ছেন যে আপনি একইভাবে লজিকাল ক্রিয়াকলাপ সম্পাদন করতে এবং ও ও এর জন্য এক্সওআর ব্যবহার করতে চান। আপনার প্রদত্ত কোডটি আসলে যা দেখায় আমি তা প্রকাশ করি:

public static boolean logicalXOR(boolean x, boolean y) {
    return ( ( x || y ) && ! ( x && y ) );
}

আপনার ফাংশনটিতে বুলিয়ান ইনপুট রয়েছে এবং যখন বুলিওয়ানস এক্সওআরটি বুলিয়ানগুলিতে ব্যবহার করা হয় ফলাফল আপনি যে কোড সরবরাহ করেছেন তার সমান। অন্য কথায়, বিটওয়াইজ এক্সওআর ইতিমধ্যে দক্ষ যখন পৃথক বিট (বুলিয়ান) তুলনা করে বা পৃথক বিটগুলি বৃহত্তর মানগুলির সাথে তুলনা করে। এটিকে প্রসঙ্গে রাখার জন্য, বাইনারি মানগুলির ক্ষেত্রে কোনও শূন্য-মান মান সত্য এবং কেবলমাত্র জিরো মিথ্যা।

সুতরাং XOR একইভাবে প্রয়োগ করার জন্য লজিকাল এ্যান্ড প্রয়োগ করা হয়, আপনি কেবলমাত্র একটি বিট (একই ফলাফল এবং দক্ষতা প্রদান করে) দ্বারা বাইনারি মানগুলি ব্যবহার করবেন বা বাইনারি মান প্রতি বিটের পরিবর্তে পুরো হিসাবে মূল্যায়ন করতে হবে। অন্য কথায় অভিব্যক্তি (010 ^^ 110) = FALSE এর পরিবর্তে (010 AL 110) = 100. এটি অপারেশন থেকে শব্দার্থগত অর্থের বেশিরভাগ সরিয়ে ফেলবে এবং এমন কোনও যৌক্তিক পরীক্ষার প্রতিনিধিত্ব করবে যা আপনি যেভাবে ব্যবহার করবেন না।


1

A এবং B এর বুলিয়ান মানগুলি তৈরি করতে হবে! = Xor এর সমান যাতে সত্যের টেবিলটি একই দেখায়। আপনিও ব্যবহার করতে পারেন! (A == B) লোল।


1

আমি খুব জনপ্রিয় ক্লাস "org.apache.commons.lang.BooleanUtils" ব্যবহার করছি

এই পদ্ধতিটি অনেক ব্যবহারকারী এবং নিরাপদ দ্বারা পরীক্ষা করা হয়। আনন্দ কর. ব্যবহার:

boolean result =BooleanUtils.xor(new boolean[]{true,false});

0

কারণ বুলিয়ান ডেটা টাইপটি একটি পূর্ণসংখ্যার মতো সংরক্ষণ করা হয়, বিট অপারেটর boo এক্সওআর অপারেশনের মতো ফাংশনগুলি যদি বুলিয়ান মান সহ ব্যবহৃত হয়।

//©Mfpl - XOR_Test.java

    public class XOR_Test {
        public static void main (String args[]) {
            boolean a,b;

            a=false; b=false;
            System.out.println("a=false; b=false;  ->  " + (a^b));

            a=false; b=true;
            System.out.println("a=false; b=true;  ->  " + (a^b));

            a=true;  b=false;
            System.out.println("a=true;  b=false;  ->  " + (a^b));

            a=true; b=true;
            System.out.println("a=true; b=true;  ->  " + (a^b));

            /*  output of this program:
                    a=false; b=false;  ->  false
                    a=false; b=true;  ->  true
                    a=true;  b=false;  ->  true
                    a=true; b=true;  ->  false
            */
        }
    }

0

এখানে একটি উদাহরণ:

2 টি মান দেওয়া হয়েছে, যদি ইতিবাচক হয় এবং একটি ধনাত্মক হয় তবে সত্যটি প্রত্যাবর্তন করুন। "Negativeণাত্মক" প্যারামিটারটি যদি সত্য হয় তবে দুটিই নেতিবাচক হলেই সত্যটি ফিরে আসুন।

    public boolean posNeg(int a, int b, boolean negative) {
      if(!negative){
        return (a>0 && b<0)^(b>0 && a<0);
      }
      else return (a<0 && b<0);
    }

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.