বুলিয়ান চেকগুলির জন্য xor অপারেটরটি ব্যবহার করা কি ভাল অনুশীলন? [বন্ধ]


150

আমি ব্যক্তিগতভাবে একচেটিয়া বা , ^অপারেটরটি পছন্দ করি যখন এটি সংক্ষিপ্ততার কারণে বুলিয়ান চেকগুলির প্রসঙ্গে অর্থবোধ করে। আমি অনেক বেশি লিখতে পছন্দ করি

if (boolean1 ^ boolean2)
{
  //do it
}

চেয়ে

if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
  //do it
}

তবে আমি প্রায়শই অন্যান্য অভিজ্ঞ জাভা বিকাশকারীদের (কেবলমাত্র নবাবিদের নয়) বিভ্রান্ত চেহারাগুলি পেয়ে যাই, এবং কখনও কখনও এটি কীভাবে কেবল বিটওয়াইজ অপারেশনের জন্য ব্যবহার করা উচিত সে সম্পর্কে মন্তব্য করি।

^অপারেটরের ব্যবহার সম্পর্কে সর্বোত্তম অভ্যাস সম্পর্কে আমি আগ্রহী ।

উত্তর:


298

আপনি কেবল !=পরিবর্তে ব্যবহার করতে পারেন ।


36
"এর সাথে কী হয়েছে! =" bool1 ^ bool2 ^ bool3 আমার কাছে তার চেয়ে বেশি যুক্তিযুক্ত বোধ তৈরি করেbool1 != bool2 != bool3
ব্লুরাজা - ড্যানি ফ্লুঘুফুট

4
আমার মাথা আঘাতপ্রাপ্ত. সুতরাং! = ভুল ফলাফল দিতে পারে বা না?
vemv

27
@ ওয়েমভ, এর !=জন্য সঠিক ফলাফল দেয় boolean(তবে Booleanএর জন্য সতর্ক হন না)। এটি সর্বদা সুন্দর না যদিও উদাহরণস্বরূপ (some != null) != (other != null)খুব পঠনযোগ্য নয় isn't আপনাকে হয় স্পষ্টভাবে বুলেটিনে অংশগুলি বের করতে হবে, বা !=আলাদা পদ্ধতিতে অংশটি বের করতে হবে ।
আইভ্যান্ট

23
এখানে কেন: a ^ b=> "ক বা খ তবে উভয় নয়", a != b=> "ক খের সমান নয়"। (@ রবার্টগ্র্যান্ট কী বলেছে)। বেশিরভাগ মানুষ প্রথমটি সহজভাবে বুঝতে পারে যদি তারা জানত যে জোর কী (আপনি কম্পিউটিংয়ের ক্ষেত্রে রয়েছেন কিনা তা জানা বেশ কার্যকর ...)
হ্যারল্ড আর ইজন

2
@ হ্যারল্ডআর.এর গুরুত্বপূর্ণ নাইটপিকিং এখানে: a != b=> "এ বি করা স্বতন্ত্র নয়"
মারিও রিউটার

27

আমি মনে করি আপনি নিজের প্রশ্নের উত্তর দিয়েছেন - আপনি যদি মানুষের কাছ থেকে অদ্ভুত চেহারা পান, তবে আরও সুস্পষ্ট বিকল্পের সাথে যাওয়া সম্ভবত নিরাপদ।

আপনার যদি এটির মন্তব্য করার প্রয়োজন হয়, তবে সম্ভবত আপনি আরও ভার্জোজ ভার্সন দিয়ে এটি প্রতিস্থাপন করা এবং লোকদের প্রথমে প্রশ্ন জিজ্ঞাসা না করা ভাল।


6
আমি আপনাকে (boolean1 && !boolean2) || (boolean2 && !boolean1)
হোলগার

17

আমি দেখতে পেয়েছি যে আমার সাথে একই রকম কথোপকথন রয়েছে। একদিকে, আপনার লক্ষ্য অর্জনের জন্য আপনার একটি কমপ্যাক্ট, দক্ষ পদ্ধতি রয়েছে। অন্যদিকে, আপনার কাছে এমন কিছু আছে যা আপনার বাকী দল বুঝতে পারে না, এটি ভবিষ্যতে বজায় রাখা কঠিন করে তোলে।

আমার সাধারণ নিয়মটি জিজ্ঞাসা করতে হবে যে প্রযুক্তিটি ব্যবহৃত হচ্ছে এমন কোনও বিষয় যা সাধারণভাবে প্রোগ্রামারদের জানতে আশা করা যুক্তিসঙ্গত। এই ক্ষেত্রে, আমি মনে করি যে প্রোগ্রামাররা বুলিয়ান অপারেটরগুলি কীভাবে ব্যবহার করবেন তা জেনে আশা করা যুক্তিসঙ্গত, সুতরাং যদি বিবৃতিটি ঠিক থাকে তবে একটি xor ব্যবহার করা উচিত।

এমন কোনও কিছুর উদাহরণ হিসাবে যা ঠিক হবে না, অস্থায়ী ভেরিয়েবল ব্যবহার না করে দুটি ভেরিয়েবল অদলবদল করার জন্য xor ব্যবহারের কৌশলটি গ্রহণ করুন। এটি এমন একটি কৌশল যা আমি প্রত্যেকেই পরিচিত হওয়ার প্রত্যাশা করব না, সুতরাং এটি কোড পর্যালোচনা পাস করবে না।


14

আমি মনে করি এটি ঠিক আছে যদি আপনি এটি মন্তব্য করেন, যেমন // ^ == XOR


10

এটির একটি ভার্বোজের নাম দেওয়ার জন্য আপনি সর্বদা এটি কোনও কার্যে গুটিয়ে রাখতে পারেন:

public static boolean XOR(boolean A, boolean B) {
    return A ^ B;
}

তবে, আমার কাছে মনে হয়েছে যে গুগলের কাছে really অপারেটর কী তা তাড়াতাড়ি তাড়াতাড়ি জানেন না এমন কারও পক্ষে এটা কঠিন হবে না। এটি প্রথমবারের পরে মনে রাখা কঠিন হবে না। যেহেতু আপনি অন্যান্য ব্যবহারের জন্য বলেছেন, তাই বিট মাস্কিংয়ের জন্য এক্সওআর ব্যবহার করা সাধারণ।

আপনি এটিও করতে পারেন একটি তৃতীয় অস্থায়ী পরিবর্তনশীল ব্যবহার না করেই দুটি ভেরিয়েবল মান অদলবদল করার XOR ব্যবহার

// Swap the values in A and B
A ^= B;
B ^= A;
A ^= B;

এক্সওআর অদলবদ সম্পর্কিত একটি স্ট্যাকওভারফ্লো প্রশ্ন এখানে ।


6

আমি সম্প্রতি একটি কাজ জাভাস্ক্রিপ্ট প্রকল্পে একটি জোর ব্যবহার করেছি এবং কী চলছে তা বোঝাতে 7 লাইন মন্তব্য যুক্ত করে শেষ করেছি । যে প্রেক্ষাপটে XOR ব্যবহার করার জন্য আত্মপক্ষ সমর্থন শর্তাবলী (যে একজন ছিলেন term1নীচে দেওয়া উদাহরণে) না দুই কিন্তু তিনটি মান নিতে পারে: undefined, trueবা falseঅন্যান্য সময় ( term2) হতে পারে trueবা false। আমাকে undefinedকেসগুলির জন্য অতিরিক্ত চেক যোগ করতে হবে তবে জোওরের সাথে, নিম্নলিখিতটি যথেষ্ট ছিল যেহেতু জোওর প্রথম শব্দটিকে প্রথম বুলিয়ান হিসাবে মূল্যায়ন করতে বাধ্য করে, undefinedযেমন চিকিত্সা করার জন্য false:

if (term1 ^ term2) { ...

এটি শেষ অবধি কিছুটা ওভারকিল ছিল, তবে আমি এটি কোনওভাবেই ইস্টার ডিম হিসাবে বাছাই করে রাখতে চাইছিলাম।


আইএমএইচও, অন্তর্নিহিত রূপান্তরের উপর নির্ভর করার পরিবর্তে, এমন পরিস্থিতিতে যেটি মুখোমুখি হওয়া অস্বাভাবিক নয়, রূপান্তরটি সুস্পষ্ট করা আরও ভাল । এবং সাধারণভাবে, "অপরিজ্ঞাতকে মিথ্যা হিসাবে ধরা দেওয়া" যে কোনও ভাষাতেই প্রশ্নোত্তর অনুশীলন। আমি জাভাতে ত্রি-রাষ্ট্রীয় মানগুলি ব্যবহার করি নি, তবে সি # তে bool? aসত্যের ব্যবহারের জন্য একটি মান স্পষ্টভাবে পরীক্ষা করা যেতে পারে a == true- জাভাতে কি একই রকম কৌশল রয়েছে? সি # তে দুটি bool?মান দেওয়া হয়েছে , "নালকে মিথ্যা হিসাবে গণ্য করুন" এর দিকে পরিচালিত করবে (a == true) ^ (b == true)। একটি সমতুল্য সূত্র হয় (a == true) != (b == true)। আপনি জাভা তেমন কিছু করতে পারেন?
টুলমেকারস্টেভ

5
if((boolean1 && !boolean2) || (boolean2 && !boolean1)) 
{ 
  //do it 
} 

আইএমএইচও এই কোডটি সরল করা যেতে পারে:

if(boolean1 != boolean2) 
{ 
  //do it 
} 

5

কোডের স্বচ্ছতার কথা মাথায় রেখে আমার অভিমতটি হল যে বুলিয়ান চেকগুলিতে এক্সওআর ব্যবহার করা এক্সওর বিটওয়াইস অপারেটরের জন্য সাধারণ ব্যবহার নয়। আমার অভিজ্ঞতা থেকে, জাভাতে বিটওয়াইস এক্সওরটি সাধারণত একটি মুখোশ flag toggleব্যবহার বাস্তবায়নের জন্য ব্যবহৃত হয় :

flags = flags ^ MASK;

বিপন সিঙ্গেলার এই নিবন্ধটি ব্যবহারের ক্ষেত্রে আরও বিশদভাবে ব্যাখ্যা করেছে।

আপনার উদাহরণ হিসাবে যেমনটি আপনাকে বিটওয়াইজ এক্সওআর ব্যবহার করতে হবে, আপনি কেন এটি ব্যবহার করছেন তা মন্তব্য করুন, কেননা আপনি কেন এটি ব্যবহার করছেন তা বোঝার জন্য এমনকি কিছুটা বিটওয়্যার সাক্ষর দর্শকদেরও তাদের ট্র্যাকগুলিতে থামানো প্রয়োজন।


-1

আমি ব্যক্তিগতভাবে "বুলিয়ান 1 ^ বুলিয়ান 2" এক্সপ্রেশনটি তার সংযোগের কারণে পছন্দ করি।

আমি যদি আপনার পরিস্থিতিতে ছিলাম (একটি দলে কাজ করছি), তবে "আইসডিফরেন্ট (বুলেটিয়ান 1, বুলেট 2)" এর মতো বর্ণনামূলক নাম সহ একটি ফাংশনে "বুলিয়ান 1 ^ বুলিয়ান 2" যুক্তি সংযুক্ত করে আমি একটি সমঝোতা করব।

উদাহরণস্বরূপ, "boolean1 ^ boolean2" ব্যবহার না করে আপনি "isDifferent (বুলেটিয়ান 1, বুলেটিয়ান 2)" এই জাতীয় কল করবেন:

if (isDifferent(boolean1, boolean2))
{
  //do it
}

আপনার "isDifferent (বুলেট 1, বুলেট 2)" ফাংশনটি দেখতে এমন হবে:

private boolean isDifferent(boolean1, boolean2)
{
    return boolean1 ^ boolean2;
}

অবশ্যই, এই সমাধানটি একটি বহিরাগতভাবে বহিরাগত ফাংশন কল ব্যবহার করে, যা নিজেই সেরা অভ্যাসগুলির যাচাইয়ের বিষয়, তবে এটি ক্রিয়াপদ (এবং কুরুচিপূর্ণ) এক্সপ্রেশনটি "(বুলিয়ান 1 &&! বুলিয়ান 2) এড়িয়ে চলে || "!


-2

যদি ব্যবহারের প্যাটার্ন এটি ন্যায্যতা দেয় তবে কেন নয়? যদিও আপনার দল অপারেটরটি ঠিক তখনই তাদের চিনতে পারে না time মানুষ সব সময় নতুন শব্দ শিখেন। প্রোগ্রামিংয়ে কেন হয় না?

আমি কেবল সতর্কতার সাথে বলতে পারি যে "^" আপনার দ্বিতীয় বুলিয়ান চেকের শর্ট সার্কিট শব্দার্থবিজ্ঞান নেই। আপনার যদি সত্যিই শর্ট সার্কিট শব্দার্থবিজ্ঞানের প্রয়োজন হয় তবে স্থিতিশীল ব্যবহারের পদ্ধতিটিও কার্যকর হয়।

public static boolean xor(boolean a, boolean b) {
    return (a && !b) || (b && !a);
}

16
আমি জোরের সাথে কোনও সংক্ষিপ্ত সার্কিটের সম্ভাবনা দেখতে পাচ্ছি না - ফলাফলটি মূল্যায়নের জন্য আপনাকে a এবং b উভয়ই জানতে হবে।
থেলিমা

7
এছাড়াও, আর্গুমেন্টগুলি এট কল টাইমকে মূল্যায়ন করা হবে, সুতরাং কোনও সংক্ষিপ্ত সার্কিটই ঘটবে না।
এরিক্ক্যালেন

3
অতিরিক্তভাবে, মেশিন স্তরে xor একক অপারেশন হওয়া উচিত।
ওগ্রে গীতসংহিতা

আপনার সম্ভবত শর্ট সার্কিট মূল্যায়ন এবং অলস মূল্যায়নের মধ্যে পার্থক্যটি সন্ধান করা উচিত। সংক্ষিপ্ত-কার্কুট মূল্যায়ন এমন একটি কোড শৈলী যা কলগুলি প্রতিরোধ করে যা অন্যথায় রানটাইম ত্রুটির ক্ষেত্রে যেমন শূন্য দ্বারা বিভাজন ঘটায়। সিতে এটি ´if (ডিনোমিনেটর! = 0 && সংখ্যা / ডিনোমিনেটর) হতে পারে which যা এতে শূন্য দ্বারা বিভাজন রোধ করতে অলস মূল্যায়ন ব্যবহার করে self আপনার উত্তরটিও নিখুঁত অনুমানমূলক।
মার্টিন

2
সত্যি কথা বলতে কী, একজন প্রোগ্রামার একটি ফাংশন লেখেন xor, যা জোর অপারেটর যা করে ঠিক তা করে তবে একটি চক্রাকারে, কেবলমাত্র ব্যবহৃত একটি প্রোগ্রামারের চেয়ে আমার মনে (বিশেষত যোগ্যতার বিষয়ে) আরও প্রশ্ন উত্থাপন করবে ^
স্টিজন ডি উইট

-3

! = দুটি ভেরিয়েবলের সাথে তুলনা করা ঠিক আছে। যদিও এটি একাধিক তুলনা সহ কার্যকর হয় না।


-3

বিটওয়াইজ অপারেটর হিসাবে, এক্সোরটি প্রতিস্থাপনের জন্য অন্য যে কোনও মাধ্যমের তুলনায় অনেক দ্রুত। সুতরাং কর্মক্ষমতা সমালোচনামূলক এবং স্কেলেবল গণনার জন্য, xor অপরিহার্য।

আমার বিষয়ভিত্তিক ব্যক্তিগত মতামত: বুলিয়ানদের জন্য সমতা (== বা! =) ব্যবহার করা একেবারেই নিষিদ্ধ। এটি ব্যবহার করে বেসিক প্রোগ্রামিং নীতিশাস্ত্র এবং মৌলিকগুলির অভাব দেখায়। যে কেউ আপনাকে বিভ্রান্ত দেখায় তাকে বুলিয়ান বীজগণিতের মূল বিষয়গুলিতে ফেরত পাঠানো উচিত (আমি "বিশ্বাসের নদীতে" এখানে লিখতে প্ররোচিত হয়েছিল :))।


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

1
এছাড়াও, ^ মূলত কোনও বুলিয়ান (যুক্তি) অপারেটর নয়, এটি একটি বিটওয়াস অপারেটর। এটি পাঠককে ধীর করতে বলে, কারণ সাইন বাগ থাকার সম্ভাবনা রয়েছে। আপনি যদি ^ এর জন্য ব্যবহার করেন! =, আপনি যদি সি-তে কখনও প্রোগ্রাম করেন তবে আপনি সত্যিই গোলমেলে যাবেন বিটওয়াইস অপারেটরগুলি আপনার পাঠকদের (যারা আপনাকে সহ আপনার কোডটি ডিবাগ করছে) তাদের মন্থর হওয়ার জন্য এবং চিহ্ন ত্রুটিগুলি অনুসন্ধান করার জন্য একটি সংকেত are । এবং তারা কৃপণ হতে পারে। উদাহরণস্বরূপ, আপনি কি জানতেন যে জাভা এর% সি বা পাইথনের মতো সত্যিকারের মডুলো নয়? আমার কাছে একবার কোডের স্নিপেট ছিল যা সি, জাভাস্ক্রিপ্ট এবং পাইথনে একই ছিল, তবে জাভাতে নয়।
ডেভিড লেপপিক

6
এটি কীভাবে উত্সাহ পেল? প্রথমত, জাভা এক্সওআর এবং! = তে সংকলিত [ স্ট্যাকওভারফ্লো . com/ a/ 4175512/202504 ( ( একই একই কোডে), দ্বিতীয়ত এমনকি সমতা এবং জোওরের জন্য এসেম্বলার টেস্টিংয়ে প্রতিটি একক সাধারণ অপারেশন। আপনার বিবৃতি ব্যাক আপ করার জন্য আপনার কি কোনও নম্বর আছে?
jmiserez

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