কখন শর্তসাপেক্ষ অভিব্যক্তিতে বিটওয়াইজ অপারেটরটি ব্যবহার করা উপযুক্ত?


15

প্রথম, কিছু ব্যাকগ্রাউন্ড: আমি একজন আইটি শিক্ষক-প্রশিক্ষণ এবং আমি জাভা বুলিয়ান অপারেটরদের আমার দশম শ্রেণির ক্লাসে পরিচয় করানোর চেষ্টা করছি। আমার শিক্ষক-পরামর্শদাতা আমি প্রস্তুত একটি কার্যপত্রকটি দেখেছি এবং মন্তব্য করেছি যে আমি তাদের কেবল একটি একক & বা ব্যবহার করতে পারি অপারেটরদের বোঝাতে, কারণ তারা "একই কাজ করে"।

আমি & এবং & এর মধ্যে পার্থক্য সম্পর্কে অবগত।
এবং "বিট-টুইডলিং" সম্পাদন করার জন্য পূর্ণসংখ্যার মধ্যে ব্যবহারের উদ্দেশ্যে তৈরি বিটওয়াস অপারেটর।
&& হ'ল শর্তসাপেক্ষ অপারেটর যা বুলিয়ান মানগুলির মধ্যে ব্যবহারের জন্য উদ্দিষ্ট।

এই অপারেটররা সর্বদা "একই জিনিসটি করে না" এই বিষয়টি প্রমাণ করার জন্য আমি একটি উদাহরণ খুঁজে বের করেছিলাম যেখানে বুলিয়ান মানগুলির মধ্যে বিটওয়াইজ ব্যবহার করা ত্রুটি ঘটায়। আমি এই উদাহরণ খুঁজে পেয়েছি

boolean bitwise;
boolean conditional;
int i=10, j=12;
bitwise = (i<j) | ((i=3) > 5); // value of i after oper: 3
System.out.println(bitwise+ " "+ i);
i=10; 
conditional = (i<j) || (i=3) > 5 ;  // value of i after oper: 10
System.out.println(conditional+ " "+ i);
i=10; 
bitwise = (i>j) & (i=3) > 5;   // value of i after oper: 3
System.out.println(bitwise+ " "+ i);
i=10; 
conditional = (i>j) && (i=3) > 5;  // value of i after oper: 10
System.out.println(conditional+ " "+ i);

এই উদাহরণটি দেখায় যে যদি মানটির প্রকাশের দ্বিতীয়ার্ধে পরিবর্তন করতে হয়, তবে এটি ফলাফলের মধ্যে পার্থক্য সৃষ্টি করতে পারে, যেহেতু বিটওয়াইজ আগ্রহী অপারেটর, শর্তসাপেক্ষে একটি শর্ট সার্কিট হিসাবে আচরণ করে (দ্বিতীয়টি মূল্যায়ন করে না) অর্ধেক, যদি প্রথমার্ধটি && এর ক্ষেত্রে মিথ্যা হয় এবং ||) এর ক্ষেত্রে সত্য।

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

আমি && এবং এর ব্যবহারকে উত্সাহিত করার জন্য আমার পছন্দটি ব্যাখ্যা করতে পারি ওভার এবং এবং | কারণ এটি সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের একটি স্বীকৃত কোডিং কনভেনশন

তবে কেউ কি আমাকে আরও উন্নততর, এমনকি বাস্তব-জগতের উদাহরণ দিতে পারেন, শর্তাধীন অভিব্যক্তিতে বিটওয়াস অপারেটর ব্যবহারের উদাহরণ?

উত্তর:


16

আপনি যখন একটি মাস্কিং অপারেশন করছেন এটি উপযুক্ত

যদি ((a & b)> 0) {...

যেখানে ক এবং খ পূর্ণসংখ্যা হয়

|| এবং | এবং && এবং & কে বিনিময়যোগ্য নয়

| এবং & amost কখনই নিজের দ্বারা শর্তসাপেক্ষ প্রকাশে উপস্থিত হবে না (আপনি যে লিঙ্কটি অন্তর্ভুক্ত করেছেন সেটি হল এই জাতীয় জিনিসগুলি প্রায়শই ত্রুটিযুক্ত থাকে)

সম্পাদনা: আপনার পরামর্শদাতার সাথে তর্ক করবেন না; আপনি জিতলেও, আপনি হেরে। পরিবর্তে, ব্যাখ্যা করুন যে আপনি একই পাঠের মধ্যে লজিকাল অপারেটর এবং বিটওয়াইজ অপারেটরগুলির মিশ্রন করে শিক্ষার্থীদের বিভ্রান্ত করতে চান না। আপনি ব্যাখ্যা করতে পারেন যে i = 3 এবং j = 2 যদি i & j = 2 হয়, তবে আমি এবং জে ত্রুটি। তবে এর সহজ ব্যাখ্যাটি হ'ল আপনি বুলিয়ান (লজিকাল) অপারেটরদের শেখাচ্ছেন, তাই বিশেষ ক্ষেত্রে বিটওয়াইয়া সমতুল্য নিক্ষেপ করা পাঠের মূল বিষয় থেকে দূরে থাকা। পরামর্শদাতাকে "ভুল" করার দরকার নেই, এবং পাল্টা উদাহরণ দেওয়ার দরকার নেই। পাঠ ফোকাস বুলিয়ান অপারেটর, হয় না bitwise অপারেটরদের।

রূপান্তরকারী হিসাবে, আপনি যখন বিটওয়াইজ অপারেটরদের পড়াতে শুরু করেন, তখন বিশেষ কেস দেখাতে হবে না যেখানে + এবং - একই ফলাফল প্রকাশ করে & এবং |


উপরের কোডটি ভুল নয়, যদিও এটি বিভ্রান্তিকর হতে পারে তবে যেহেতু এটি দাঁড়িয়ে আছে যে কোডটিতে কোনও ত্রুটি রয়েছে না? আমি সম্মত হই যে এইভাবে বিটওয়াইজ অপারেটরগুলি ব্যবহার করা খুব বেশি পঠনযোগ্য নয়, আমি যদি কোনও কোড পর্যালোচনা করে দেখে থাকি তবে এটি পছন্দ করি না তবে এটি আইনি জাভা (এবং সি #ও, System.out.println উপেক্ষা করে) is
স্টিভ

উত্তর দেওয়ার জন্য ধন্যবাদ স্টিভেন এ। লো। আপনি বলেছিলেন "|| এবং | এবং&& এবং বিনিময়যোগ্য নয়" তবে bitwise = !(true & true == false);এবং condition = !(true && true == false);উভয়ই সত্যের সাথে মূল্যায়ন করবে, তাই এই ক্ষেত্রে তারা বিনিময়যোগ্য? সিনট্যাক্টিক্যালি সম্ভবত, যেহেতু কোডটি এখনও সংকলন করে। আমি সম্মতি জানাব যে এগুলি বিভিন্ন জিনিসগুলির জন্য শব্দার্থগতভাবে ব্যবহৃত হয়, যেমন আমি অনুচ্ছেদ ২ তে উল্লেখ করেছি আপনি বলেছেন যে! এবং & "প্রায়শই নিজের দ্বারা শর্তসাপেক্ষে উপস্থিত হয় না"। আমি এই "প্রায় কখনই না" মামলাগুলি খুঁজছি এবং ভাবছি যে এগুলি বৈধভাবে বিদ্যমান কিনা।
দিরশা

@ দিরশা: || এবং && চালনা শুধুমাত্র Booleans উপর। এবং এবং | পূর্ণসংখ্যা এবং বুলিয়ানগুলিতে পরিচালনা করুন - বুলিয়ানগুলি সামাল দেওয়ার জন্য বিটওয়াইস অপারেটরগুলি ( একাধিক বিটের উপর পরিচালিত করার উদ্দেশ্যে ) ব্যবহার করার সামান্য বিন্দু রয়েছে , এবং এটি পরিত্যাগের সাথে করা বিভ্রান্তিকর কোড এবং অপ্রত্যাশিত আচরণের দিকে পরিচালিত করতে পারে (যেমন যদি আপনি ঘটনাক্রমে সংখ্যার পরিবর্তে একটি পূর্ণসংখ্যা ব্যবহার করেন তবে বুলিয়ান, বিটওয়াইজ অপারেটররা অভিযোগ করবে না)
স্টিভেন এ লো লো

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

2
@ স্টিভেন এ। লো: যদি i = 3 এবং j = 2 হয় তবে আমি এবং জে = 2, যখন আমি এবং জে ত্রুটি এটি উজ্জ্বল! এটি সহজ এবং এটি বিন্দু তোলে। দশম গ্রেড স্তরে এটি করাও সম্ভবত একটি ভুল, কারণ তারা এখনও বুলিয়ান ধরণের অভ্যস্ত হয়ে উঠছে এবং অপারেটররা কী প্রয়োগ করবে। তোমাকে অনেক ধন্যবাদ! আমার পরামর্শদাতার সাথে তর্ক না করার বিষয়ে দুর্দান্ত পরামর্শ।
দিরশা

12

নন-বিটওয়াইজ অপারেটর &&এবং ||শর্ট সার্কিট অপারেটর are অন্য কথায়, &&যদি, এলএইচএস মিথ্যা হয়, আরএইচএস কখনও মূল্যায়ন করা হবে না; সঙ্গে ||যদি LHS সত্য হয় তাহলে RHS মূল্যায়ন করা হবে না। অন্যদিকে, বিটওয়াইজ অপারেটরগুলি &এবং |নন-শর্ট সার্কিট, এবং সর্বদা এলএইচএস এবং আরএইচএস উভয়কেই মূল্যায়ন করবে। অন্যথায়, তারা একটি ifবিবৃতিতে সমতুল্য ।

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


1
+1 টি। ঠিক ঠিক, বুলিয়ানদের বিটওয়াইজ এবং লজিকাল অপারেটরগুলির সাথে তুলনা করার সময় সর্বদা একই ফলাফলটি ফিরে আসে, তবে (জাভা এবং সি # কমপক্ষে) কেবলমাত্র লজিকাল অপারেটরদের শর্ট সার্কিট।
স্টিভ

উত্তরের জন্য ধন্যবাদ. শর্তসাপেক্ষে শর্ট সার্কিট হিসাবে আচরণ করার সময় আপনার অনুচ্ছেদ 1টি আমি আমার অনুচ্ছেদে 4 এ যাবার চেষ্টা করছিলাম, বিটওয়াইসটি আগ্রহী অপারেটর হিসাবে উল্লেখ করে । আপনার অনুচ্ছেদ 2 হ'ল উদ্বেগটি আমি আমার অনুচ্ছেদে 5 এ বর্ণিত So সুতরাং আমি পার্থক্য সম্পর্কে অবগত কিন্তু আমি সেই নির্দিষ্ট উদাহরণটির সন্ধান করছি যা আপনি বা আমি ভাবতেও পারি না।
দিরশা

7

সাধারণ দার্শনিক উত্তর হ'ল বুলিয়ান অপারেটরগুলির জন্য বিটওয়াইজ অপারেটরগুলি ব্যবহার অ্যাটিক্যাল এবং কোডটি পড়া আরও শক্ত করে তোলে। অনুশীলনে (কোডটি যা উত্পাদিত হয়), আরও পঠনযোগ্য কোড বজায় রাখা সহজ এবং এইভাবে আরও আকাঙ্ক্ষিত।

সংক্ষিপ্ত-সার্কিট অপারেটরগুলির প্রয়োজনের সত্যিকারের বিশ্ব ব্যবহারের জন্য, কেসগুলি দেখুন যেমন:

if (args.length > 0 && args[0] == 'test') ....

if (b != NULL && b.some_function()) ...

if (b == NULL || b.some_function()) ...

এই ধরণের অপারেশনগুলি রিয়েল-ওয়ার্ল্ড কোডে ঘন ঘন প্রদর্শিত হয়।


TFA। আমার 15 বছরের বৃদ্ধদের আমি কীভাবে ব্যাখ্যা করব যে &2 টির চেয়ে 1 "পড়া কঠিন"? আমার কাছে এমন কোনও উদাহরণ নেই যা 2 বোলার অপারেটর বুলিয়ান অপারেন্ডগুলির জন্য একইভাবে কাজ করে না। আমি আরও পঠনযোগ্য এবং কোড বজায় রাখা সহজ সম্পর্কে আপনার বিষয়ে একমত। আমি তাদের সুন্দর কোড লিখতে উত্সাহিত করতে চাই। তবে আমার সরঞ্জামগুলির ব্যাগে কিছু প্রমাণ থাকা "কারণ আমি বলেছি" তার চেয়ে বেশি বিশ্বাসযোগ্য হবে। আমার কাছে এটির সেই লিঙ্কটিতে একটি মান হিসাবে বর্ণনা করা আছে এবং আমি যে উদাহরণটি সন্ধান করছি তা না পেলে একা একা নির্ভর করতে হতে পারে। আমি যেমন @ স্টিভ হাইকে জিজ্ঞাসা করেছি: জাভা কি এটি একটি অনুচিত ব্যবহার হিসাবে চিহ্নিত করা উচিত?
দিরশা

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

4

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

উদাহরণস্বরূপ state = CONNECTED | IN_PROGRESSযেখানে CONNECTED could be 0x00000001এবংIN_PROGRESS 0x00000010

আরও তথ্যের জন্য, পতাকা enums ডকুমেন্টেশন সন্ধান করুন।


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

আমি কল করি না বলে জাভাতে এটি ঘটতে পারে বলে আমি মনে করি না বা & এমন মানগুলিতে অপারেটরগুলি যা বিটওয়াইজ হতে পারে না এবং 'বা' কেবল একটি লজিকাল সম্পাদন করে বা & জাভাতে যদি এটি হয় তবে তা আমি স্মরণ করতে পারি না তবে এটি সি # এমএসডিএন-এ রয়েছে তা নিশ্চিত করেই জানুন: "বাইনারি | অপারেটরগুলি ইন্টিগ্রাল টাইপ এবং বুলের জন্য পূর্বনির্ধারিত। বুল অপারেন্ডস, | এর
অপারেশনগুলির

আরও কিছু গবেষণা করার পরে, আমি খুঁজে পেলাম যে | এবং || এবং জাভাতে বুলিয়ান ক্রিয়াকলাপগুলির জন্য & এবং& শর্ট সার্কিট আচরণ তাই আপনি যে দৃশ্যের বর্ণনা দিচ্ছেন তা সত্যিই সম্ভব নয়।
pwny

0

অন্যায়ের একটি সহজ উদাহরণ:

int condA=1, condB=2;

if (condA!=0 && condB!=0) {
    // correct!
}
if ((condA & condB)!=0) {
    // never executed
}

এখানে আপনার দুটি শর্ত রয়েছে, উভয়ই শূন্য নয়; কিন্তু বিটওয়াইসের &ফলাফল শূন্যে।


@ জাভিয়ার: উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ, তবে আমি একটু বিভ্রান্ত আমি জাভাতে কাজ করছি, এবং এই কোডটি সংকলন করে না। (condA && condB)ত্রুটিগুলি, কারণ && 2 intটি 2 টির জন্য কাজ করে না , কেবল 2 বুলিয়ান। (condA & condB)সঠিক int হওয়ার সাথে সাথে জাভাতে মূল্যায়ন করে আমরা if(int)এটি বলতে পারি না তাই এটির ত্রুটিও রয়েছে। আমি প্রথমে যা বুঝতে চাইছি তা বুঝতে পেরে- ঠিক সেইরকম অন্যায়ের উদাহরণ
দিরশা

দীর্ঘদিন ধরে জাভা ব্যবহার করেনি ... চেষ্টা করুন (Boolean(condA) && Boolean(condB)) (আমার মনে Boolean(x)হয় trueশূন্য-শূন্য পূর্ণসংখ্যার জন্য, তাই না?)
জাভিয়ের

নাপ @ জাভিয়ার: ইন্টি থেকে বুলিয়ান তে কাস্ট করা যাবে না।
দিরশা

কি ((condA!=0) && (condB!=0))?
জাভিয়ের

@ জাভিয়ার হ্যাঁ এটি সংকলন করে, তবে "অন্যায়" চিত্রিত হয় না if (((condA!=0) && (condB!=0))) { System.out.println("correct"); } if (((condA!=0) & (condB!=0))) { System.out.println("never executed?"); }উভয় মুদ্রণ বিবৃতি কার্যকর করে।
দিরশা 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.