जवाबों:
मॉडुलो ऑपरेटर के बजाय, जिसमें गैर-नकारात्मक पूर्णांकों के लिए थोड़ा अलग शब्दार्थ है, आप शेष ऑपरेटर का उपयोग कर सकते हैं %
। आपके सटीक उदाहरण के लिए:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
यह एक लाइनर के लिए सरलीकृत किया जा सकता है:
isEven = (a % 2) == 0;
%
इसका मूल्यांकन करने से ==
पहले इसका मूल्यांकन किया गया था, इसलिए यह स्पष्ट नहीं होगा कि अभिव्यक्ति के बराबर है (a%2)==0
या नहीं a%(2==0)
। मुझे लगता है कि यह जावा में कम महत्वपूर्ण है जहां एक बूलियन पूर्णांक के समान नहीं है
यहां न्यूनतम जावा कोड में आपके छद्म कोड का प्रतिनिधित्व है;
boolean isEven = a % 2 == 0;
मैं अब इसे इसके घटकों में तोड़ दूँगा। जावा में मापांक ऑपरेटर प्रतिशत चरित्र (%) है। इसलिए एक int% int लेना एक और int देता है। दोहरे समतुल्य (==) ऑपरेटर का उपयोग मूल्यों की तुलना करने के लिए किया जाता है, जैसे कि एक जोड़ी ints और एक बूलियन देता है। यह तब बूलियन चर 'isEven' को सौंपा गया है। ऑपरेटर पूर्वता के आधार पर तुलना से पहले मापांक का मूल्यांकन किया जाएगा।
चूंकि बाकी सभी ने पहले ही जवाब दे दिया था, इसलिए मैं थोड़ा अतिरिक्त संदर्भ जोड़ूंगा। % "मापांक" ऑपरेटर वास्तव में शेष संचालन कर रहा है। मॉड और रेम के बीच का अंतर सूक्ष्म है, लेकिन महत्वपूर्ण है।
(-1 मॉड 2) सामान्य रूप से 1. अधिक विशेष रूप से दिए गए दो पूर्णांक, एक्स और वाई, ऑपरेशन (एक्स मॉड वाई) का मूल्य सीमा [0, वाई) में वापस आ जाता है। अलग ढंग से कहा, एक्स और वाई का मापांक हमेशा शून्य से अधिक या बराबर होता है, और वाई से कम होता है।
"%" या रेम ऑपरेटर के साथ एक ही ऑपरेशन का प्रदर्शन एक्स मूल्य का संकेत रखता है। यदि X ऋणात्मक है, तो आपको सीमा में परिणाम मिलता है (-Y, 0]। यदि X सकारात्मक है, तो आपको सीमा [0, Y) में परिणाम मिलता है।
अक्सर यह सूक्ष्म अंतर कोई मायने नहीं रखता। अपने कोड प्रश्न पर वापस जा रहे हैं, हालांकि, "समता" के लिए हल करने के कई तरीके हैं।
शुरुआती लोगों के लिए पहला दृष्टिकोण अच्छा है, क्योंकि यह विशेष रूप से क्रिया है।
// Option 1: Clearest way for beginners
boolean isEven;
if ((a % 2) == 0)
{
isEven = true
}
else
{
isEven = false
}
दूसरा दृष्टिकोण भाषा का बेहतर लाभ उठाता है, और अधिक संक्षिप्त कोड की ओर जाता है। (यह मत भूलो कि == ऑपरेटर एक बूलियन देता है।)
// Option 2: Clear, succinct, code
boolean isEven = ((a % 2) == 0);
तीसरा दृष्टिकोण पूर्णता के लिए यहां है, और टर्नरी ऑपरेटर का उपयोग करता है । हालांकि टर्नरी ऑपरेटर अक्सर बहुत उपयोगी होता है, इस मामले में मैं दूसरे दृष्टिकोण को बेहतर मानता हूं।
// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;
चौथा और अंतिम दृष्टिकोण पूर्णांक के द्विआधारी प्रतिनिधित्व के ज्ञान का उपयोग करना है । यदि कम से कम महत्वपूर्ण बिट 0 है तो संख्या सम है। इसे बिटवाइज़-एंड ऑपरेटर (&) का उपयोग करके चेक किया जा सकता है । जबकि यह दृष्टिकोण सबसे तेज़ है (आप विभाजन के बजाय सरल बिट मास्किंग कर रहे हैं), यह शायद शुरुआत के लिए थोड़ा उन्नत / जटिल है।
// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);
यहां मैंने बिटवाइज़-एंड ऑपरेटर का उपयोग किया, और इसे विकल्प 2 में दिखाए गए संक्षिप्त रूप में दर्शाया। विकल्प 1 के फॉर्म (और वैकल्पिक रूप से विकल्प 3) में इसे फिर से पढ़ते हुए पाठक को एक अभ्यास के रूप में छोड़ दिया जाता है। ;)
उम्मीद है की वो मदद करदे।
नकारात्मक X और सकारात्मक Y मानों के लिए MOD की तरह काम करने के लिए जावा का% (REM) ऑपरेशन प्राप्त करने के लिए, आप इस विधि का उपयोग कर सकते हैं:
private int mod(int x, int y)
{
int result = x % y;
if (result < 0)
{
result += y;
}
return result;
}
या टर्नरी ऑपरेटर के साथ (कम, लेकिन कुछ स्थितियों में संभव या कम कुशल नहीं):
private int mod(int x, int y)
{
int result = x % y;
return result < 0? result + y : result;
}
जावा वास्तव में कोई modulo ऑपरेटर नहीं है जिस तरह से C करता है। जावा में% एक शेष ऑपरेटर है। सकारात्मक पूर्णांकों पर, यह बिल्कुल मॉडुलो की तरह काम करता है, लेकिन यह नकारात्मक पूर्णांकों पर अलग तरह से काम करता है और, मोडुलो के विपरीत, फ्लोटिंग पॉइंट नंबरों के साथ भी काम कर सकता है। फिर भी, कुछ भी लेकिन सकारात्मक पूर्णांकों पर% का उपयोग करना दुर्लभ है, इसलिए यदि आप इसे मॉडुलो कहना चाहते हैं, तो स्वतंत्र महसूस करें!
array[x mod array.length]
नकारात्मक स्थानों को अनुक्रमित करने की कोशिश करने के बजाय मेरे सरणी में एक तत्व पहुंच जाए ।
(x % y + y) % y
या जावा 8 में शुरू,Math.floorMod(x, y)
हालांकि यह जांचना उचित है कि क्या मान नकारात्मक है और यह सही है कि क्या यह सही है (जैसे कि कई लोगों ने सुझाव दिया है), वहाँ एक और अधिक कॉम्पैक्ट समाधान है।
(a % b + b) % b
यह सबसे पहले modulo को करेगा, मान को -b -> + b श्रेणी तक सीमित करता है और फिर यह सुनिश्चित करने के लिए b जोड़ देता है कि मान धनात्मक है, जिससे अगला modulo इसे 0 -> b श्रेणी तक सीमित कर देता है।
नोट: यदि बी ऋणात्मक है, तो परिणाम भी ऋणात्मक होगा
मोड्यूलो का उपयोग किए बिना कोड बहुत तेजी से चलता है:
public boolean isEven(int a){
return ( (a & 1) == 0 );
}
public boolean isOdd(int a){
return ( (a & 1) == 1 );
}
'शेष' ऑपरेटर% का उपयोग करने से पहले आपको विनिर्देशन की जांच करनी चाहिए:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.17.3
// bad enough implementation of isEven method, for fun. so any worse?
boolean isEven(int num)
{
num %= 10;
if(num == 1)
return false;
else if(num == 0)
return true;
else
return isEven(num + 2);
}
isEven = isEven(a);
जावा में यह %
ऑपरेटर है:
15.17.3। शेष संचालक%
ध्यान दें कि वर्ग floorMod
में भी है java.lang.Math
जो %
विभिन्न संकेतों के साथ तर्क के लिए एक अलग परिणाम देगा :
%
क्योंकि यह तर्क के नकारात्मक होने के साथ-साथ ठीक से काम भी करता है। अन्य कोई भी उत्तर वास्तव में सही नहीं हैं क्योंकि वे डिस्क्लेमर के साथ आते हैं कि% वास्तव में मोडुलो नहीं है जब तक कि तर्क सकारात्मक न हों। विशेष रूप से यदि आप किसी सरणी में प्रत्येक पूर्णांक को लगातार स्थिति में मैप करना चाहते हैं array[floorMod(i, array.length)
, तो सूचकांक सही ढंग से काम करता है, भले ही सूचकांक i
नकारात्मक क्षेत्र में चला जाए। इसके साथ ऐसा नहीं है %
।
इसके अलावा, मॉड का उपयोग इस तरह किया जा सकता है:
int a = 7;
b = a % 2;
b
बराबर होगा 1. क्योंकि 7 % 2 = 1
।
जैसा कि दूसरों ने बताया है, %
शेष (शेष) ऑपरेटर गणितीय mod
मापांक ऑपरेशन / फ़ंक्शन के समान नहीं है
।
mod
बनाम%
x mod n
समारोह के नक्शेx
के लिएn
की सीमा में[0,n)
।
जबकिx % n
ऑपरेटर रेंज में मैपx
करताn
है(-n,n)
।
गणितीय मापांक ऑपरेशन का उपयोग करने के लिए एक विधि है और x
एक के सामने संकेत के बारे में परवाह नहीं है का उपयोग कर सकते हैं:
((x % n) + n) % n
हो सकता है कि यह चित्र इसे बेहतर समझने में मदद करता हो (मुझे पहले इस समय अपने सिर को लपेटने में कठिन समय था)
int
चर के 2 ^ 32 प्रतिरूपता को ध्यान में नहीं रखता है। floorMod
विधि क्या करता है कि सही ढंग से (लेकिन आप अतिरिक्त गणना की आवश्यकता हो सकती है, तो n
नकारात्मक है)।
एक और तरीका है:
boolean isEven = false;
if((a % 2) == 0)
{
isEven = true;
}
लेकिन सबसे आसान तरीका अभी भी है:
boolean isEven = (a % 2) == 0;
जैसे @ सतेवे कुओ ने कहा।
में Java
, मॉड ऑपरेशन को इस प्रकार किया जा सकता है:
Math.floorMod(a, b)
नोट: आधुनिक आपरेशन से अलग है शेष के आपरेशन। में Java
, शेष आपरेशन जैसे किया जा सकता है:
a % b
Math.floorMod()
में यह है: The floor modulus is x - (floorDiv(x, y) * y), has the same sign as the divisor y, and is in the range of -abs(y) < r < +abs(y).
तो यह बिल्कुल गणितीय मापांक के समान नहीं है। लेकिन , एक सकारात्मक परिणाम प्राप्त करने का एक तरीका है, उसी पद्धति के जवादोक में भी:If the signs of arguments are unknown and a positive modulus is needed it can be computed as (floorMod(x, y) + abs(y)) % abs(y).
floorMod
ऑपरेशन उम्मीद के मुताबिक काम करता है। मूल्यों के floorMod
लिए भी है long
और अन्यथा BigInteger
बड़े मूल्यों के लिए है।
@ कोड से कोड का एक विकल्प:
मापांक ऑपरेटर का उपयोग करना:
bool isEven = (a % 2) == 0;
मुझे लगता है कि यह अगर / नहीं है, तो लिखने की तुलना में थोड़ा बेहतर कोड है, क्योंकि कम दोहराव और अप्रयुक्त लचीलापन है। यह जांच करने के लिए थोड़ी अधिक मस्तिष्क शक्ति की आवश्यकता होती है, लेकिन isEven
क्षतिपूर्ति का अच्छा नामकरण ।