"| =" এর অর্থ কী? (পাইপ সমান অপারেটর)


249

আমি গুগল অনুসন্ধান এবং স্ট্যাক ওভারফ্লো ব্যবহার করে অনুসন্ধান করার চেষ্টা করেছি, তবে এটি কোনও ফলাফল দেখায় নি। আমি এটি ওপেনসোর্স লাইব্রেরি কোডটিতে দেখেছি:

Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;

"| =" ( pipe equal operator) এর অর্থ কী?


4
আমি ভাবছি যদি pipe equal operatorএই প্রশ্নের মতো বা বিষয়টিতে অন্য কোনও ডকুমেন্টেশন যুক্ত করা লোক অনুসন্ধানে সহায়তা না করে।
সাগ্রুরেট

10
@ ইজেপি আপনি ছেলেরা এই ডক্স সম্পর্কে কথা বলছেন । এটি স্পষ্টভাবে ডক্সগুলিকে এর ব্যবহার সম্পর্কে ডকুমেন্টেশনের অভাব বলে দেয় ।
wtsang02

36
আপনি যদি না জানতেন তবে এটিকে পাইপ সমান বলা হত, কাউকে জিজ্ঞাসা না করে অনুসন্ধান করা সত্যিই কঠিন।
ataulm

@ অটলম সত্যই, এমন একটি শব্দ নিয়ে এসেছিল vertical barযা শেষ পর্যন্ত আমাকে এখানে নিয়ে এসেছিল which
রুটার

উত্তর:


323

|=যেমন পড়া +=

notification.defaults |= Notification.DEFAULT_SOUND;

হিসাবে একই

notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;

|বিট-ওয়াইজ ওআর অপারেটরটি কোথায় ।

সমস্ত অপারেটর এখানে রেফারেন্স করা হয়

একটি বিট-বুদ্ধিমান অপারেটর ব্যবহার করা হয় কারণ ঘন ঘন, এই ধ্রুবকগুলি পতাকা বহন করতে কোনও প্রকারকে সক্ষম করে।

আপনি যদি এই ধ্রুবকগুলির দিকে নজর দেন তবে আপনি দেখতে পাবেন যে তারা দু'জনের হাতে রয়েছে:

public static final int DEFAULT_SOUND = 1;
public static final int DEFAULT_VIBRATE = 2; // is the same than 1<<1 or 10 in binary
public static final int DEFAULT_LIGHTS = 4; // is the same than 1<<2 or 100 in binary

সুতরাং আপনি বিট বুদ্ধিমান বা পতাকা যুক্ত করতে ব্যবহার করতে পারেন

int myFlags = DEFAULT_SOUND | DEFAULT_VIBRATE; // same as 001 | 010, producing 011

সুতরাং

myFlags |= DEFAULT_LIGHTS;

কেবলমাত্র আমরা একটি পতাকা যুক্ত করার অর্থ।

এবং প্রতিসমভাবে, আমরা পরীক্ষা করি যে এটি ব্যবহার করে একটি পতাকা সেট করা হয় &:

boolean hasVibrate = (DEFAULT_VIBRATE & myFlags) != 0;

2
শুধু j += 1;হিসাবে একই j = j + 1;
ডেভিড শোয়ার্জ

1
@ আরএস: আমি জাভাতে একটি পাল্টা উদাহরণের কথা ভাবতে পারি না (হতে পারে যদি jহয় volatile)) তবে আমি আপনার শব্দটি এর জন্য নেব।
ডেভিড শোয়ার্টজ

6
@DavidSchwartz দেখুন এই
arshajii

2
boolean hasVibrate = DEFAULT_VIBRATE & myFlags;- আপনি জাভা থেকে পছন্দ করতে অনুবাদ intকরতে booleanপারেন? এটি সি তে বৈধ হবে, তবে আমি ভেবেছিলাম জাভাতে এটি লিখতে হবেboolean hasVibrate = ((DEFAULT_VIBRATE & myFlags) == DEFAULT_VIBRATE);
ব্লুরাজা - ড্যানি ফ্লুঘুফুট

1
@ ডেভিডশওয়ার্টজ ওয়াও, এই তুলনাটি +=অবশেষে এটি বুঝতে আমার পক্ষে কৌশলটি করেছে। ধন্যবাদ!
সি

39

আপনি ইতিমধ্যে আপনার প্রশ্নের যথেষ্ট উত্তর পেয়েছেন। তবে আমার উত্তর হতে পারে আপনাকে |=বাইনারি অপারেটরদের সম্পর্কে আরও সহায়তা করতে ।

আমি বিটওয়াইজ অপারেটরদের জন্য টেবিল লিখছি :
নিম্নলিখিতগুলি বৈধ:

----------------------------------------------------------------------------------------
Operator   Description                                   Example
----------------------------------------------------------------------------------------
|=        bitwise inclusive OR and assignment operator   C |= 2 is same as C = C | 2
^=        bitwise exclusive OR and assignment operator   C ^= 2 is same as C = C ^ 2
&=        Bitwise AND assignment operator                C &= 2 is same as C = C & 2
<<=       Left shift AND assignment operator             C <<= 2 is same as C = C << 2
>>=       Right shift AND assignment operator            C >>= 2 is same as C = C >> 2  
----------------------------------------------------------------------------------------

নোট করুন সমস্ত অপারেটর বাইনারি অপারেটর are

এছাড়াও দ্রষ্টব্য: (নীচের পয়েন্টগুলির জন্য আমি আমার উত্তর যুক্ত করতে চেয়েছিলাম)

  • >>>জাভাতে বিটওয়াইড অপারেটর যাকে স্বাক্ষরিত শিফট বলে
    তবে >>>=জাভাতে অপারেটর নয়। >>> = অপারেটর

  • ~বিটওয়াইড পরিপূরক বিট, 0 to 1 and 1 to 0(ইউনিারি অপারেটর) তবে ~=অপারেটর নয়।

  • উপরন্তু, !বলা যৌক্তিক নয় অপারেটর, কিন্তু !=চেক যদি দুটি operands মান যদি মান তারপর সমান শর্ত সত্য হয়ে নয়, সমান বা হয় না। যেমন (A != B) is true। যেখানে A=!Bযদি হয়ে Bথাকে trueতবে যদি Aহয়ে থাকে false(এবং যদি Bহয় falseতবে)A পরিণত true)।

পার্শ্ব নোট: |পাইপ বলা হয় না, পরিবর্তে এর বলা হয় OR, পাইপ শেল পরিভাষা একটি প্রক্রিয়া পরের দিকে স্থানান্তর ..


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

18

|=গ্রোভিতে কী করে সে সম্পর্কে আমি একটি উত্তর খুঁজছিলাম এবং যদিও উপরের উত্তরগুলি ঠিক আছে তবে তারা আমাকে নির্দিষ্ট কোডের একটি নির্দিষ্ট অংশ বুঝতে সাহায্য করে নি।

বিশেষত, যখন বুলিয়ান পরিবর্তনশীল "| =" এ প্রয়োগ করা হয় এটি প্রথমবার এটি সত্যে সেট করবে যখন এটি ডান পাশে সত্যবাদী অভিব্যক্তির মুখোমুখি হবে এবং সমস্ত | = পরবর্তী কলগুলির জন্য তার সত্য মানটি ধরে রাখবে। কুঁচির মতো।

এখানে এর সরলীকৃত উদাহরণ:

groovy> boolean result  
groovy> //------------ 
groovy> println result           //<-- False by default
groovy> println result |= false 
groovy> println result |= true   //<-- set to True and latched on to it
groovy> println result |= false 

আউটপুট:

false
false
true
true

সম্পাদনা : কেন এটি দরকারী?

এমন একটি পরিস্থিতি বিবেচনা করুন যেখানে আপনি জানতে চান যে বিভিন্ন জিনিসে কোনও কিছুর পরিবর্তন হয়েছে এবং তাই যদি কিছু পরিবর্তনকে অবহিত করে। সুতরাং, আপনি একটি hasChangesবুলিয়ান সেটআপ করবেন এবং এটি সেট করুন |= diff (a,b)এবং তারপর |= dif(b,c)ইত্যাদি Here এখানে একটি সংক্ষিপ্ত উদাহরণ দেওয়া হল:

groovy> boolean hasChanges, a, b, c, d 
groovy> diff = {x,y -> x!=y}  
groovy> hasChanges |= diff(a,b) 
groovy> hasChanges |= diff(b,c) 
groovy> hasChanges |= diff(true,false) 
groovy> hasChanges |= diff(c,d) 
groovy> hasChanges 

Result: true

10
হ্যাঁ, একইভাবে জাভাতে রয়েছে। কিন্তু এটা মূল্য লক্ষ করেন, যেমন করে বা প্রক্রিয়া y|=exprহয় শর্ট সার্কিট না (অসদৃশ y = y || expr), যার মানে হল exprসবসময় মূল্যায়ন করেন। এই প্রথমবারের মত আমার জন্য সুস্পষ্ট ছিল না :) সুতরাং এটা যে প্রতিস্থাপন refactoring সামনে নোট করা জরুরী y|=expry=y||xহয় শব্দার্থগতভাবে সমতুল্য ক্ষেত্রে exprআসলে পার্শ্ব প্রতিক্রিয়া হয়েছে।
এনআইএ

1
এবং, মনের মধ্যে এই হচ্ছে আপনার ক্ষেত্রে সঙ্গে hasChangesএটি হবে সম্ভবত ভালো হতে পছন্দ y=y||xসংক্ষিপ্ত ciruit থেকে উপকৃত ফর্ম যখন আপনি কোনো পরিবর্তন খুঁজে পাওয়া যায়নি এটা আসলে susequent diffs করতে কারণ আপনি ইতিমধ্যে উত্তর জানা প্রয়োজন হয় না কারণ। (বাস্তব জীবনের পরিস্থিতি বিশেষত গুরুত্বপূর্ণ যখন তুলনামূলক বিষয়গুলি জটিল এবং diffসেগুলিকে যুক্ত করা খুব দ্রুত নয়)
এনআইএ

@ এনআইএ আপ ভোটের জন্য ধন্যবাদ। হ্যাঁ আমি শর্ট সার্কিট সম্পর্কে আপনার বক্তব্যের সাথে একমত।
dbrin

2
@ ফ্র্যাঙ্কলিনইউ অবশ্যই বাস্তবায়ন বিশদ নয়। অ-শর্ট-সার্কিটনেসটি নির্দিষ্টভাবে নির্দিষ্ট করা হয়নি কারণ আপনি নির্দিষ্ট স্থান হিসাবে উল্লেখ করেছেন কারণ এটি অদ্ভুততা নয় - এটি বেশিরভাগ অপারেটরের জন্য ডিফল্ট এবং স্বাভাবিক আচরণ। অদ্ভুততা আসলে সংক্ষিপ্ত-সার্কিটনেস এবং ||এবং স্পেসিফিকেশনের 15.23 এবং 15.24&& সম্পর্কিত বিভাগে এই সত্যটি স্পষ্টভাবে ঘোষণা করা হয়েছে, এবং এই পার্থক্য থেকে এবং জোর দেওয়া হয়েছে। |&
এনআইএ

2
@FranklinYu তাই আমি মনে করি আবার এই নিম্নোক্ত পর্বে আপনি রেফারেন্সড সম্পর্কে কিছু বলতে করার কোন প্রয়োজন ছিল না (15.26.2 "Compund নিয়োগ অপারেটার") মাত্র কারণ compond বরাদ্দকরণ কেবল সবসময় অ শর্ট সার্কিট হয় (সেখানে নেই ||=এবং &&=অপারেটরদের যা would নিয়ম ভঙ্গ এবং বিশেষ উল্লেখ প্রয়োজন)।
এনআইএ

13

এটি এর জন্য একটি সংক্ষিপ্তকরণ:

notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;

এবং |একটি বিট বুদ্ধিমান OR।



3

দ্রষ্টব্য: || = বিদ্যমান নেই। (যৌক্তিক বা) আপনি ব্যবহার করতে পারেন

y= y || expr; // expr is NOT evaluated if y==true

অথবা

y = expr ? true : y;  // expr is always evaluated.

4
পুরোপুরি সম্পূর্ণ নয়: আপনি এখনও y |= exprবুলিয়ানগুলির সাথে ব্যবহার করতে পারেন এবং এটি yআপনার স্বরূপ হিসাবে গুরুত্বপূর্ণ নোটের সাথে একই ফলাফল দেয় যে এটি সংক্ষিপ্ত-কার্টুইট নয় , যার অর্থ এক্সপ্রার সর্বদা মূল্যায়ন করা হয়, এমনকি ক্ষেত্রেy==true
এনআইএ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.