সি # এর কীভাবে শর্তসাপেক্ষ XOR
অপারেটর নেই?
উদাহরণ:
true xor false = true
true xor true = false
false xor false = false
সি # এর কীভাবে শর্তসাপেক্ষ XOR
অপারেটর নেই?
উদাহরণ:
true xor false = true
true xor true = false
false xor false = false
& | ^
) বনাম শর্তসাপেক্ষ অপারেটর ( && ||
) উল্লেখ করছেন। কিন্তু আপনি অধিকার (অবশ্যই), একটি যৌক্তিক XOR হয় ... করছি
উত্তর:
সি # তে, শর্তসাপেক্ষ অপারেটরগুলি প্রয়োজন হলে কেবলমাত্র তাদের দ্বিতীয় অপারেন্ড চালায় ।
যেহেতু একটি এক্সওআর অবশ্যই উভয় মানকে সংজ্ঞা দ্বারা পরীক্ষা করে, তাই শর্তাধীন সংস্করণটি নির্বোধ।
উদাহরণ :
লজিকাল এবং: &
- প্রতিবার উভয় পক্ষের পরীক্ষা করে।
যৌক্তিক OR: |
- প্রতিবারই উভয় পক্ষের পরীক্ষা করুন।
শর্তাধীন এবং: &&
- 1 ম দিকটি সত্য হলে কেবল দ্বিতীয় পক্ষের পরীক্ষা করে।
শর্তাধীন OR: ||
- 1 ম দিকটি মিথ্যা হলে কেবল দ্বিতীয় পক্ষের পরীক্ষা করুন।
প্রশ্নটি কিছুটা পুরানো তবে ...
এই অপারেটরের কীভাবে কাজ করা উচিত:
true xor false = true
true xor true = false
false xor true = true
false xor false = false
এইভাবে! = অপারেটর বুল ধরণের সাথে কাজ করে:
(true != false) // true
(true != true) // false
(false != true) // true
(false != false) // false
সুতরাং আপনি যেমন দেখতে পাচ্ছেন তেমনি ^^
বিদ্যমানটিকে প্রতিস্থাপন করা যাবে!=
!=
জন্য কাজ করবে।
AND
এবং OR
তেমন কিছুই নেই XOR
। বা কমপক্ষে আমরা বুঝতে পারি নি !=
:) @ এভিলগ্রিবো
লজিকাল এক্সওআর অপারেটরটি রয়েছে: ^
ডকুমেন্টেশন: সি # অপারেটর এবং ^ অপারেটর
^
বুলিয়ান অপারেন্ডসের সাথে ব্যবহার করা হলে এটি একটি বুলিয়ান অপারেটর। "বুল অপারেন্ডসের জন্য, ^ অপারেটর অসমতার অপারেটরের মতো একই ফলাফলের গণনা করে! ="। আপনি বিটওয়াইস-এক্সওর পূর্ণসংখ্যার সাথে অপারেশন করতে পারেন ^
। সি # সি নয়
কেবল একটি স্পষ্টকরণ হিসাবে, ^ অপারেটর উভয়ই অবিচ্ছেদ্য ধরণের এবং বুলের সাথে কাজ করে।
দেখুন দুটিই MSDN এর ^ অপারেটর (গ # রেফারেন্স) :
বাইনারি ^ অপারেটরগুলি ইন্টিগ্রাল টাইপ এবং বুলের জন্য পূর্বনির্ধারিত। অবিচ্ছেদ্য ধরণের জন্য, its এর অপারেশনগুলির বিটওয়াইজ একচেটিয়া-OR গণনা করে। বুল অপারেন্ডসের জন্য, its লজিকাল একচেটিয়াভাবে গণনা করে - বা এর অপারেশনগুলির; এটি হ'ল, ফলাফলটি সত্য এবং যদি কেবল তার অপারেশনগুলির মধ্যে একটি সত্য হয়।
এই প্রশ্নটি যখন জিজ্ঞাসা করা হয়েছিল তখন থেকেই ডকুমেন্টেশনটি পরিবর্তিত হয়েছে।
^
হয় যা পাঁচ বছরের মধ্যে এটির উল্লেখ ও পূর্বাভাস দেয়। আমার সন্দেহ হয় কিছু বদলে গেছে।
মার্ক এল দ্বারা জিজ্ঞাসা করা হিসাবে , এখানে সঠিক সংস্করণ:
Func<bool, bool, bool> XOR = (X,Y) => ((!X) && Y) || (X && (!Y));
সত্যের টেবিলটি এখানে:
X | Y | Result
==============
0 | 0 | 0
1 | 0 | 1
0 | 1 | 1
1 | 1 | 0
তথ্যসূত্র: এক্সক্লুসিভ ওআর
ওহ হ্যাঁ, এটা করে
bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
i1
একটি বাইট হয় ঠিক তেমন)। এটি 100% সংজ্ঞায়িত এবং নিরাপদ পরিচালিত আচরণ। সিএলআর রাগড আপ হয় না ;; মাইক্রোসফ্ট পেক্স ব্যবহার করার সময় এই আচরণটি প্রথম দেখলাম।
শর্তসাপেক্ষ xor অস্তিত্বহীন, তবে আপনি যৌক্তিক একটি ব্যবহার করতে পারেন কারণ জোর বুলিয়ানদের জন্য সংজ্ঞায়িত করা হয়, এবং সমস্ত শর্তসাপেক্ষ তুলনাগুলি বুলিয়ানদের কাছে মূল্যায়ন করে।
সুতরাং আপনি যেমন কিছু বলতে পারেন:
if ( (a == b) ^ (c == d))
{
}
1
। এটি একটি সামান্য পরিচিত ঘটনা। আপনি এমন পরিস্থিতিতে শেষ করতে পারেন যেখানে দুটি অ-ভুয়া বুলিয়ানগুলির জোর এখনও অ-মিথ্যা! যা এই নির্দিষ্ট কোডটিতে বলেছে যে জোর অপারেটরটি কেবল কখনও [0,1] এর মানগুলিতে প্রয়োগ হয় যাতে আমার মন্তব্যটি (পুরোপুরি) প্রয়োগ না হয়।
&
দুর্বলও।
&&
হয় &
।
লজিকাল এক্সওর অপারেটর থাকাকালীন শর্তযুক্ত^
কোনও জোর অপারেটর নেই। আপনি নিম্নলিখিতটি ব্যবহার করে দুটি এবং A এর মান শর্তসাপেক্ষ জোর অর্জন করতে পারেন:
A ? (!B) : B
পেরেনগুলি প্রয়োজনীয় নয়, তবে আমি তাদের পরিষ্কার করার জন্য যুক্ত করেছি।
দ্য এভিল গ্রিবো দ্বারা নির্দেশিত হিসাবে, এটি উভয় অভিব্যক্তিকে মূল্যায়ন করে, তবে xor এবং এবং বা এর মতো সংক্ষিপ্তভাবে প্রচার করা যায় না ।
0101 ^ 0011
এর মান রয়েছে 0110
।
শর্তসাপেক্ষ (শর্ট সার্কিট) এক্সওআর বলে কোনও জিনিস নেই। শর্তসাপেক্ষ অপারেটরগুলি কেবল তখনই অর্থবহ হয় যখন কেবলমাত্র প্রথম যুক্তির দিকে তাকানোর মাধ্যমে চূড়ান্ত ফলাফলটি নিশ্চিতভাবে বলার উপায় থাকে tell এক্সওআর (এবং সংযোজন) এর জন্য সর্বদা দুটি যুক্তি প্রয়োজন, সুতরাং প্রথম যুক্তির পরে শর্ট সার্কিটের কোনও উপায় নেই।
আপনি যদি A = সত্য জানেন, তবে (A XOR B) =! বি।
আপনি যদি এ = মিথ্যা জানেন, তবে (এ এক্সওর বি) = বি
উভয় ক্ষেত্রে, আপনি যদি A না তবে B না জানেন তবে আপনি যথেষ্ট পরিমাণে জানেন না (A XOR B)। উত্তরটি গণনা করতে আপনাকে অবশ্যই সর্বদা A এবং B উভয়ের মান শিখতে হবে। আক্ষরিকভাবে কোনও ব্যবহারের কেস নেই যেখানে আপনি উভয় মান ছাড়াই XOR সমাধান করতে পারেন resolve
মনে রাখবেন, সংজ্ঞা অনুসারে XOR এর চারটি মামলা রয়েছে:
false xor true = true
true xor false = true
true xor true = false
false xor false = false
আবার, আশা করি উপরের দিক থেকে এটি সুস্পষ্ট যে প্রথম মানটি জানা দ্বিতীয় উত্তরটি না জেনেও উত্তর পাওয়ার পক্ষে যথেষ্ট নয়। তবে, আপনার প্রশ্নে, আপনি প্রথম কেসটি বাদ দিয়েছেন। আপনি যদি পরিবর্তে চেয়েছিলেন
false op true = false (or DontCare)
true op false = true
true op true = false
false op false = false
তাহলে আপনি একটি শর্ট সার্কিট শর্তসাপেক্ষ অপারেশন দ্বারা এটি পেতে পারেন:
A && !B
তবে এটি কোনও এক্সওআর নয়।
এই প্রশ্নের স্নেহপূর্বক উত্তর দেওয়া হয়েছে, তবে আমি একটি ভিন্ন পরিস্থিতি জুড়ে এসেছি। এটি সত্য যে শর্তাধীন XOR এর দরকার নেই। এটিও সত্য যে ^ অপারেটরটি ব্যবহার করা যেতে পারে। তবে, যদি আপনাকে কেবল অপারেন্ডগুলির "সত্য || মিথ্যা" স্থিতি পরীক্ষা করতে হয় তবে ^ সমস্যা দেখা দিতে পারে। উদাহরণ স্বরূপ:
void Turn(int left, int right)
{
if (left ^ right)
{
//success... turn the car left or right...
}
else
{
//error... no turn or both left AND right are set...
}
}
এই উদাহরণে, যদি বামটি 10 (0xa) এ সেট করা থাকে এবং ডানটি 5 (0x5) এ সেট করা হয় তবে "সাফল্য" শাখা প্রবেশ করা হবে। এর জন্য (নির্বোধের সরল যদি উদাহরণস্বরূপ) উদাহরণস্বরূপ, এর ফলে বাগটি হবে কারণ আপনার একই সাথে বাম এবং ডানদিকে ঘুরিয়ে দেওয়া উচিত নয়। আমি প্রশ্নকর্তার কাছ থেকে যা সংগ্রহ করেছি তা হ'ল তিনি আসলে একটি শর্তসাপেক্ষ চেয়েছিলেন, তবে জোরকে যাবার সাথে সাথে মানগুলিতে সত্য / মিথ্যা সম্পাদন করার একটি সহজ উপায়।
একটি ম্যাক্রো কৌশলটি করতে পারে:
#define my_xor(a, b) ( ((a)?1:0) ^ ((b)?1:0) )
যদি আমি চিহ্ন থেকে দূরে থাকি তবে আমাকে চারপাশে চড় মারতে হবে: o)
আমি এটি পোস্ট করার পরে নীচে জিম্রিডের উত্তরটি পড়েছি (খারাপ ইয়াপডগ!) এবং তার আসলেই সহজ। এটি কার্যকর হবে এবং আমি কেন তার উত্তরটি বাতিল হয়ে গেল তা সম্পর্কে একেবারেই ধারণা নেই ...
if
একটি বুলিয়ান এক্সপ্রেশন প্রয়োজন, এটি এমনকি কোন int দিয়ে সংকলন করবে না।
!=
বিকল্প হিসাবে কাজ কিভাবে ?