जावा में मॉड के लिए वाक्यविन्यास क्या है


231

छद्मकोश में एक उदाहरण के रूप में:

if ((a mod 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}

जवाबों:


357

मॉडुलो ऑपरेटर के बजाय, जिसमें गैर-नकारात्मक पूर्णांकों के लिए थोड़ा अलग शब्दार्थ है, आप शेष ऑपरेटर का उपयोग कर सकते हैं %। आपके सटीक उदाहरण के लिए:

if ((a % 2) == 0)
{
    isEven = true;
}
else
{
    isEven = false;
}

यह एक लाइनर के लिए सरलीकृत किया जा सकता है:

isEven = (a % 2) == 0;

80
यदि / अन्यथा अनावश्यक है, तो isEven = (एक% 2) == 0 का उपयोग करें,
स्टीव कू

59
Mod और modular से सावधान क्योंकि n (mod m) IS ALWAYS> = 0 है लेकिन n% m नहीं है। n% m रेंज में है> -m और <m। हालांकि जावा में इंट और लॉन्ग प्रकार के लिए एक शेष ऑपरेटर है, लेकिन इसमें कोई मापांक फ़ंक्शन या ऑपरेटर नहीं है। यानी, -12% 10 = -2 जबकि -12 मॉड 10 = 8. यदि% ऑपरेटर n% m के लिए ऋणात्मक मान लौटाता है, तो (n% m) + m आपको n mod m देगा। BigInteger दोनों के लिए फ़ंक्शन प्रदान करता है और उनके लिए विशिष्टताओं में अंतर को काफी अच्छी तरह से समझाया गया है। इसके अलावा, शून्य के साथ सावधान। गणित में, जबकि शून्य एक समान संख्या है, यह सकारात्मक या नकारात्मक नहीं है।
जिम

4
@ nl-x संभवत: इसलिए बेहतर होगा कि इसे अधिवेशन की तुलना में पूर्ववर्तीता के बारे में स्पष्ट किया जाए। एक के लिए मुझे पता नहीं था कि %इसका मूल्यांकन करने से ==पहले इसका मूल्यांकन किया गया था, इसलिए यह स्पष्ट नहीं होगा कि अभिव्यक्ति के बराबर है (a%2)==0या नहीं a%(2==0)। मुझे लगता है कि यह जावा में कम महत्वपूर्ण है जहां एक बूलियन पूर्णांक के समान नहीं है
मैथ्यू सैन्सबरी

8
यह मापांक ऑपरेटर नहीं है - यह शेष ऑपरेटर है। कृपया पोस्ट को सही करें!
कीरन जॉनस्टोन

2
बूलियन भी = ((a (1) == 0)। बहुत आसान।
महादेव

111

यहां न्यूनतम जावा कोड में आपके छद्म कोड का प्रतिनिधित्व है;

boolean isEven = a % 2 == 0;

मैं अब इसे इसके घटकों में तोड़ दूँगा। जावा में मापांक ऑपरेटर प्रतिशत चरित्र (%) है। इसलिए एक int% int लेना एक और int देता है। दोहरे समतुल्य (==) ऑपरेटर का उपयोग मूल्यों की तुलना करने के लिए किया जाता है, जैसे कि एक जोड़ी ints और एक बूलियन देता है। यह तब बूलियन चर 'isEven' को सौंपा गया है। ऑपरेटर पूर्वता के आधार पर तुलना से पहले मापांक का मूल्यांकन किया जाएगा।


12
न्यूनतम कोष्ठक के बिना होगा;)
pstanton

3
यह एक शेष संचालक है, मापांक संचालक नहीं।
को लोर्ने

@ user207421 इसका नाम वास्तव में शेष ऑपरेटर है, लेकिन वे इसके समकक्ष नहीं हैं: " मापांक - 4. (कंप्यूटिंग, प्रोग्रामिंग) उन संख्याओं के शेष भाग को प्राप्त करने के लिए दो संख्याओं के बीच रखा गया एक ऑपरेटर?"।
GeroldBroser ने मोनिका

93

चूंकि बाकी सभी ने पहले ही जवाब दे दिया था, इसलिए मैं थोड़ा अतिरिक्त संदर्भ जोड़ूंगा। % "मापांक" ऑपरेटर वास्तव में शेष संचालन कर रहा है। मॉड और रेम के बीच का अंतर सूक्ष्म है, लेकिन महत्वपूर्ण है।

(-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) में इसे फिर से पढ़ते हुए पाठक को एक अभ्यास के रूप में छोड़ दिया जाता है। ;)

उम्मीद है की वो मदद करदे।


धन्यवाद रॉब। यह भ्रम प्रोग्रामर को समझाने में भारी कठिनाइयों का कारण बनता है कि मॉड्यूलर गणित से गणितीय गुणों के साथ एल्गोरिदम को कैसे लागू किया जाए। शेष कोई मापांक नहीं है, लेकिन अवशेषों से मापांक को जल्दी प्राप्त कर सकते हैं।
जिम

1
@TickledPink को छोड़कर यह जावा में संकलित नहीं है।
यूजीन बेरेसोवस्की

33

नकारात्मक 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;
}

12

जावा वास्तव में कोई modulo ऑपरेटर नहीं है जिस तरह से C करता है। जावा में% एक शेष ऑपरेटर है। सकारात्मक पूर्णांकों पर, यह बिल्कुल मॉडुलो की तरह काम करता है, लेकिन यह नकारात्मक पूर्णांकों पर अलग तरह से काम करता है और, मोडुलो के विपरीत, फ्लोटिंग पॉइंट नंबरों के साथ भी काम कर सकता है। फिर भी, कुछ भी लेकिन सकारात्मक पूर्णांकों पर% का उपयोग करना दुर्लभ है, इसलिए यदि आप इसे मॉडुलो कहना चाहते हैं, तो स्वतंत्र महसूस करें!


लेकिन मैं एक वास्तविक मोड्यूलो ऑपरेटर चाहता हूं जो नकारात्मक पूर्णांक के लिए भी काम करता है ताकि array[x mod array.length]नकारात्मक स्थानों को अनुक्रमित करने की कोशिश करने के बजाय मेरे सरणी में एक तत्व पहुंच जाए ।
क्रिश

2
(x % y + y) % y या जावा 8 में शुरू,Math.floorMod(x, y)
ग्रेग चार्ल्स

12

हालांकि यह जांचना उचित है कि क्या मान नकारात्मक है और यह सही है कि क्या यह सही है (जैसे कि कई लोगों ने सुझाव दिया है), वहाँ एक और अधिक कॉम्पैक्ट समाधान है।

(a % b + b) % b

यह सबसे पहले modulo को करेगा, मान को -b -> + b श्रेणी तक सीमित करता है और फिर यह सुनिश्चित करने के लिए b जोड़ देता है कि मान धनात्मक है, जिससे अगला modulo इसे 0 -> b श्रेणी तक सीमित कर देता है।

नोट: यदि बी ऋणात्मक है, तो परिणाम भी ऋणात्मक होगा


यह अतिप्रवाह हो सकता है जब ए और बी दोनों बड़ी संख्या में होते हैं, इसलिए यह एक सही समाधान नहीं है।
ट्रिक्स वुल्फ

11

मोड्यूलो का उपयोग किए बिना कोड बहुत तेजी से चलता है:

public boolean isEven(int a){
    return ( (a & 1) == 0 );
}

public boolean isOdd(int a){
    return ( (a & 1) == 1 );
}

3
यह स्वीकृत उत्तर की तुलना में बहुत साफ दिखता है। इसका समय से पहले अनुकूलन से कोई लेना-देना नहीं है। इसका बस बेहतर है, - अगर यह काम करता है।
एलेक्स ज्यूएन

4
@LluisMartinez यह कंप्यूटिंग में सबसे गलत कथनों में से एक है। पूर्ण उद्धरण है, "प्रोग्रामर अपने कार्यक्रमों के गैर-महत्वपूर्ण भागों की गति के बारे में सोचने या चिंता करने में बहुत समय बर्बाद करते हैं, और दक्षता पर इन प्रयासों का वास्तव में एक मजबूत नकारात्मक प्रभाव पड़ता है जब डिबगिंग और रखरखाव पर विचार किया जाता है। हमें छोटे से भूलना चाहिए। क्षमता, समय के 97% के बारे में कहते हैं: समय से पहले अनुकूलन सभी बुराई की जड़ है। फिर भी हमें उस महत्वपूर्ण 3% में अपने अवसरों को पारित नहीं करना चाहिए। " जिसका असल में मतलब कुछ अलग है।
लोर्ने

3
@EJP तुम शायद सही हो। मैंने एक परीक्षण किया (1 मिलियन पुनरावृत्तियों के साथ लूप) ने 4000 नैनोसेकंड को मॉडुलो के साथ लिया, 2500 नैनोसेकंड तार्किक और के साथ।
लुलिस मार्टिनेज

इसका उत्तर क्यों होगा? यकीन है कि यह अजीब भी करता है, लेकिन मॉड / शेष ऑपरेटर के साथ कुछ भी नहीं करता है। सवाल मॉड ऑपरेटर के बारे में बात करता है, न कि कैसे भी अजीब खोजने के लिए।
मार्क वॉल्श


4

'शेष' ऑपरेटर% का उपयोग करने से पहले आपको विनिर्देशन की जांच करनी चाहिए:

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);

4

जावा में यह %ऑपरेटर है: 15.17.3। शेष संचालक%

ध्यान दें कि वर्ग floorModमें भी है java.lang.Mathजो %विभिन्न संकेतों के साथ तर्क के लिए एक अलग परिणाम देगा :

public static int floorMod​(int x, int y)


1
अपवोटेड, क्योंकि फ्लोरमॉड एक बेहतर 'मोडुलो' ऑपरेटर है %क्योंकि यह तर्क के नकारात्मक होने के साथ-साथ ठीक से काम भी करता है। अन्य कोई भी उत्तर वास्तव में सही नहीं हैं क्योंकि वे डिस्क्लेमर के साथ आते हैं कि% वास्तव में मोडुलो नहीं है जब तक कि तर्क सकारात्मक न हों। विशेष रूप से यदि आप किसी सरणी में प्रत्येक पूर्णांक को लगातार स्थिति में मैप करना चाहते हैं array[floorMod(i, array.length), तो सूचकांक सही ढंग से काम करता है, भले ही सूचकांक iनकारात्मक क्षेत्र में चला जाए। इसके साथ ऐसा नहीं है %
क्रिश

3

इसके अलावा, मॉड का उपयोग इस तरह किया जा सकता है:

int a = 7;
b = a % 2;

bबराबर होगा 1. क्योंकि 7 % 2 = 1


शुरुआती लोगों के लिए और आउटपुट के बिना एक उदाहरण में यौगिक ऑपरेटरों का उपयोग करना शायद एक गलती है।
स्टु थॉम्पसन

3

जावा में शेष ऑपरेटर है %और modulo ऑपरेटर के रूप में व्यक्त किया जा सकता है

public int mod(int i, int j)
{
  int rem = i % j;
  if (j < 0 && rem > 0)
  {
    return rem + j;
  }
  if (j > 0 && rem < 0)
  {
    return rem + j;
  }
  return rem;
}

2

जैसा कि दूसरों ने बताया है, %शेष (शेष) ऑपरेटर गणितीय modमापांक ऑपरेशन / फ़ंक्शन के समान नहीं है ।

mod बनाम %

x mod nसमारोह के नक्शे xके लिए nकी सीमा में [0,n)
जबकि x % nऑपरेटर रेंज में मैप xकरता nहै (-n,n)

गणितीय मापांक ऑपरेशन का उपयोग करने के लिए एक विधि है और xएक के सामने संकेत के बारे में परवाह नहीं है का उपयोग कर सकते हैं:

((x % n) + n) % n

हो सकता है कि यह चित्र इसे बेहतर समझने में मदद करता हो (मुझे पहले इस समय अपने सिर को लपेटने में कठिन समय था)

यहां छवि विवरण दर्ज करें


1
सुन्दर चित्रण। एक अन्य जटिलता: यह intचर के 2 ^ 32 प्रतिरूपता को ध्यान में नहीं रखता है। floorModविधि क्या करता है कि सही ढंग से (लेकिन आप अतिरिक्त गणना की आवश्यकता हो सकती है, तो nनकारात्मक है)।
मैर्टन बोडेवेस

1

एक और तरीका है:

boolean isEven = false;
if((a % 2) == 0)
{
    isEven = true;
}

लेकिन सबसे आसान तरीका अभी भी है:

boolean isEven = (a % 2) == 0;

जैसे @ सतेवे कुओ ने कहा।


0

में Java, मॉड ऑपरेशन को इस प्रकार किया जा सकता है:

Math.floorMod(a, b)

नोट: आधुनिक आपरेशन से अलग है शेष के आपरेशन। में Java, शेष आपरेशन जैसे किया जा सकता है:

a % b

ठीक नहीं है ... के javadoc 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).
पश्चिमीगंज

@EsternGun यह सच हो सकता है, लेकिन यदि आप जानते हैं कि मापांक सकारात्मक है तो floorModऑपरेशन उम्मीद के मुताबिक काम करता है। मूल्यों के floorModलिए भी है longऔर अन्यथा BigIntegerबड़े मूल्यों के लिए है।
मार्टेन बॉडीवेज़

-1

मोडुलो ऑपरेटर% (प्रतिशत संकेत) है। समानता के लिए परीक्षण करने के लिए या आम तौर पर 2 की शक्ति के लिए मोडुलो करते हैं, आप का उपयोग भी कर सकते हैं (और ऑपरेटर) जैसे = = (ए & 1)।


-3

@ कोड से कोड का एक विकल्प:

मापांक ऑपरेटर का उपयोग करना:

bool isEven = (a % 2) == 0;

मुझे लगता है कि यह अगर / नहीं है, तो लिखने की तुलना में थोड़ा बेहतर कोड है, क्योंकि कम दोहराव और अप्रयुक्त लचीलापन है। यह जांच करने के लिए थोड़ी अधिक मस्तिष्क शक्ति की आवश्यकता होती है, लेकिन isEvenक्षतिपूर्ति का अच्छा नामकरण ।


2
यह एक शेष संचालक है, मापांक संचालक नहीं।
लोर्ने

@ ईजेपी ठीक है। फिर मापांक ऑपरेटर क्या है?
TheRealChx101
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.