জাভাতে একটি বুলিয়ান উপর একটি বিটওয়াস অপারেটর এর প্রভাব


118

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

বুলিয়ানদের ক্ষেত্রে, তবে, একটি বুলিয়ানটিতে দুটি মাত্র মান থাকতে পারে। 1 = সত্য বা 0 = মিথ্যা। তবে বুলিয়ানটির আকার নির্ধারণ করা হয়নি। এটি বাইটের মতো বড় বা খানিকটা ছোটও হতে পারে।

সুতরাং একটি বুলিয়ান একটি বিটওয়াস অপারেটর ব্যবহার এর প্রভাব কি? জেভিএম মূলত এটি কোনও সাধারণ লজিকাল অপারেটরে অনুবাদ করে এবং এগিয়ে যায়? এটি কী অপারেশনের উদ্দেশ্যে বুলিয়ানকে একক বিট সত্তা হিসাবে বিবেচনা করে? বা বুলিয়ান আকারের সাথে ফলাফল কি অপরিবর্তিত?


1
আমি মনে করি আপনি বুলিয়ানটিতে বিটওয়াস অপারেটর ব্যবহার করতে পারবেন না। শুধুমাত্র সংখ্যায় on আমি নিশ্চিত ~ কাজ করবে না, অন্যান্য অপারেটরদের সম্পর্কে আমি কী জানি না।
মারটিজন কোর্টও

4
আপনি তাদের কয়েকটি ব্যবহার করতে পারেন, আমরা সবেমাত্র একটি আবিষ্কার করেছি আমাদের উত্তরাধিকার কোড ব্যবহৃত। আমরা এটিকে সরিয়ে দিচ্ছি, কিন্তু এই কোডটি সংকলিত এবং কাজ করেছে।
ড্যানিয়েল

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

উত্তর:


122

অপারেটরগুলি &, ^এবং |বিটওয়াইস অপারেটর হয় যখন অপারেশনগুলি আদিম ইন্টিগ্রাল টাইপ হয়। অপারেন্ডগুলি বুলিয়ান হওয়ার সময় এগুলি লজিকাল অপারেটর হয় এবং পরবর্তী ক্ষেত্রে তাদের আচরণ নির্দিষ্ট করা হয়। বিশদটির জন্য জাভা ভাষা নির্দিষ্টকরণের 15.22.2 বিভাগটি দেখুন ।


57
বিশেষত, এবং এবং ^ এবং | হ'ল নন-শর্ট সার্কিট লজিক্যাল বুলেটিয়ান অপারেটরগুলি।
কেন

14
এখানে উল্লিখিত বিভাগটির প্রত্যক্ষ লিঙ্ক এখানে দেওয়া হয়েছে: ডকস.অরাকল.com
অ্যান্ডি টমাস

যদি উপরেরটি সত্য হয়, আদর্শ কেন / ওজিএসএফ 7 সি নাল পয়েন্টার ব্যতিক্রম করছে? |=অপারেটরটি যদি যৌক্তিক হয় তবে প্রোগ্রামটি কখনই x.getValue()নির্দেশিকা চালানো উচিত ছিল না ।
ikromm

1
@ জন ক্রোমমিডাস, আপনার এক্স শূন্য, যে কারণে আপনি নালপয়েন্টার এক্সসেপশন পাচ্ছেন। আপনার এটি ইনস্ট্যান্ট করা দরকার to
বেন

4
@ বেন, যেমন @ কেন বলেছেন, যুক্তিটি অ স্বল্প-সার্কিট, তাই দ্বিতীয় অংশটি মূল্যায়ন করা হয়। তাই a || x.foo()নিরাপদ এক্স নাল কিনা, কিন্তু a | x.foo()নয়। |=হিসাবে একই নিয়ম অনুসরণ করে |
মাইকেল স্মিথ

86

বিটওয়াইজ অপারেটরটি ব্যবহার করলে শর্ট সার্কিটের আচরণ বাধা পেতে পারে:

boolean b = booleanExpression1() && booleanExpression2();
boolean b = booleanExpression1() & booleanExpression2();

তাহলে booleanExpression1()মূল্যায়ণ করতে false, তারপর
booleanExpression2()প্রথম ক্ষেত্রে, এবং মূল্যায়ন করা হয় না
booleanExpression2()(এবং যাই হোক না কেন পার্শ্ব প্রতিক্রিয়া আছে পারে) করা হয় দ্বিতীয় ক্ষেত্রে মূল্যায়ন,


2
এবং বিটওয়াইজ অপারেশন সাধারণত শর্ট সার্কিটের চেয়ে দ্রুত সম্পাদন করে (মূল্যায়ন সহজ হয় তবে)
আরডিএস

1
বিটওয়াইজটি &দ্রুততর হবে, তবে দ্বিতীয় ফাংশনটির কলটি এড়ানো যাবে&&
NatNgs

20

অন্য উত্তর মধ্যে আবৃত এর বাইরে, এটা মূল্য যে লক্ষ &&এবং ||থেকে আলাদা প্রাধান্য আছে &এবং |

অগ্রাধিকার টেবিল থেকে বের করুন (শীর্ষে সর্বোচ্চ অগ্রাধিকার সহ)।

bitwise AND                 &
bitwise exclusive OR        ^
bitwise inclusive OR        |
logical AND                 &&
logical OR                  ||

এটি আপনার কাছে কী বোঝায়?

একেবারে কিছুই যতদিন আপনি বিদ্ধ হয় শুধুমাত্র &এবং |অথবা শুধুমাত্র &&এবং ||

তবে, যেহেতু |এর চেয়ে বেশি প্রাধান্য রয়েছে &&(তার বিপরীতে ||, যার নিম্নতর নজির রয়েছে), অবাধে তাদের মিশ্রণ অপ্রত্যাশিত আচরণের দিকে পরিচালিত করতে পারে।

তাই a && b | c && dএকই হিসাবে a && (b | c) && d, যা হবে তার
বিপরীতে ।a && b || c && d(a && b) || (c && d)

সেগুলি এক নয় বলে প্রমাণ করার জন্য, সত্য সারণী থেকে একটি এক্সট্র্যাক্ট বিবেচনা করুন:

a | b | c | d | (b|c) | (a&&b) | (c&&d) | a && (b|c) && d | (a&&b) || (c&&d)
F | T | T | T |   T   |   F    |    T   |         F       |        T
                                                  ^                ^
                                                  |- not the same -|

আপনি বা ও বেশী প্রাধান্য আছে চান, আপনি পারে ব্যবহার |এবং &&একসঙ্গে, কিন্তু এই সুপারিশ করা হয়।

তবে আপনার সত্যিকার অর্থেই যখনই বিভিন্ন চিহ্ন ব্যবহার করা হয় তত্ক্ষণাত অগ্রাধিকার স্পষ্ট করার জন্য তাদের বন্ধনীতে আবদ্ধ করা উচিত, যেমন (a && b) || c(অগ্রাধিকার স্পষ্ট করার জন্য বন্ধনী), a && b && c(কোনও বন্ধনী প্রয়োজন নেই)।


3

এমনকি যদি এটি কাজ করে তবে আপনার এটি করা উচিত নয়। ল্যাঙ্গুয়েজ স্পেকগুলি বিটওয়াইস অপারেটরগুলি কেবল তখনই সংজ্ঞায়িত করে যখন উভয় অপারেন্ডগুলি আদিম পূর্ণ সংখ্যার বা উভয়ই বুলিয়ান প্রকারের। আমি বলব অন্য যে কোনও ক্ষেত্রে ফলাফল সংজ্ঞায়িত করা হয়নি:

http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228


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