জাভাতে মোডের সিনট্যাক্স কী


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
যদি / অন্যথায় অপ্রয়োজনীয় হয় তবে কেবলমাত্র ইভেন = (একটি% 2) == 0,
স্টিভ কুও

59
মোড এবং মডিউলার পদগুলির সাথে যত্নশীল কারণ এন (মোড এম) সর্বদা> = 0 তবে এন% এম নয়। এন% মি>> মি এবং <এম এর মধ্যে রয়েছে। যদিও জাভাতে ইনট এবং লং টাইপের জন্য বাকি অপারেটর রয়েছে তবে এর কোনও মডুলাস ফাংশন বা অপারেটর নেই। অর্থাৎ, -12% 10 = -2 যেখানে -12 মোড 10 = 8. যদি% অপারেটর n% মিটার জন্য একটি নেতিবাচক মান প্রদান করে, তবে (n% মি) + মি আপনাকে এন মোড এম দেবে। বিগইন্টিজার উভয়ের জন্য ফাংশন সরবরাহ করে এবং তাদের জন্য বিশেষ উল্লেখগুলি পার্থক্যটি বেশ ভালভাবে ব্যাখ্যা করে। এছাড়াও, শূন্য সঙ্গে সাবধান। গণিতে, শূন্য একটি সমান সংখ্যা হলেও এটি ধনাত্মক বা নেতিবাচক নয়।
জিম

4
@ এনএল-এক্স সম্ভবত কারণ এটি কনভেনশনে ছেড়ে যাওয়ার চেয়ে অগ্রাধিকার সম্পর্কে স্পষ্ট হওয়া ভাল। এক জন্য আমি জানতাম না যে %সামনে মূল্যায়ন করা হয় ==, আগে আমি এটা তাকিয়ে তাই এটি স্পষ্ট হবে না কিনা অভিব্যক্তি সমতূল্য (a%2)==0বা a%(2==0)। আমি মনে করি এটি জাভাতে কম গুরুত্বপূর্ণ যেখানে একটি বুলিয়ান একটি পূর্ণসংখ্যার মতো নয়
ম্যাথু সেন্সবারি

8
এটি মডুলাস অপারেটর নয় - এটি বাকি অপারেটর। পোস্ট সংশোধন করুন!
কাইরেন জনস্টোন

2
বুলিয়ান সমান = ((একটি এবং 1) == 0)। আরো সহজ.
এমডিদেব

111

এখানে নূন্যতম জাভা কোডে আপনার সিউডো কোডের উপস্থাপনা;

boolean isEven = a % 2 == 0;

আমি এখন এটির উপাদানগুলিতে এটি ভেঙে দেব। জাভাতে মডুলাস অপারেটর শতাংশের অক্ষর (%)। অতএব একটি int% ইন্টিরিয়েন্স গ্রহণ করা অন্য একটি int প্রদান করে। ডাবল সমান (==) অপারেটরটি মানগুলির তুলনা করতে ব্যবহৃত হয়, যেমন এক জোড়া ints এবং একটি বুলিয়ান দেয়। এরপরে এটি বুলিয়ান ভেরিয়েবল 'isEven' এ নির্ধারিত হয়। অপারেটরের অগ্রাধিকারের ভিত্তিতে তুলনা করার আগে মডুলাসটি মূল্যায়ন করা হবে।


12
সর্বনিম্ন বন্ধনী ছাড়াই হবে;)
pstanton

3
এটি একটি বাকি অপারেটর, কোনও মডুলাস অপারেটর নয়।
লার্নের মারকুইস

@ user207421 এর নামটি আসলে অপারেটর অপারেটর তবে সেগুলি কি সমতুল্য নয়: " মডুলাস - ৪ (কম্পিউটারিং, প্রোগ্রামিং) এই সংখ্যার ভাগের বাকী অংশটি পাওয়ার জন্য একটি অপারেটর দুটি সংখ্যার মধ্যে স্থাপন করে?"
জেরোল্ডব্রোসর মনিকা

93

যেহেতু অন্য প্রত্যেকে ইতিমধ্যে উত্তর দিয়েছে তাই আমি কিছুটা অতিরিক্ত প্রসঙ্গ যুক্ত করব। % "মডুলাস" অপারেটর প্রকৃতপক্ষে অবশিষ্ট অপারেশন করছে। মোড এবং রেমের মধ্যে পার্থক্যটি সূক্ষ্ম তবে গুরুত্বপূর্ণ।

(-1 মড 2) সাধারণত 1 দেবে। আরও দুটি নির্দিষ্ট সংখ্যক এক্স এবং ওয়াই প্রদত্ত, অপারেশন (এক্স মোড ওয়াই) [0, Y) এর মধ্যে একটি মান ফেরত দেয়। অন্যভাবে বলেছিলেন, এক্স এবং ওয়াইয়ের মডুলাস সর্বদা শূন্যের চেয়ে বড় বা সমান এবং Y এর চেয়ে কম থাকে is

"%" বা রিম অপারেটরের সাথে একই ক্রিয়াকলাপ সম্পাদন করে এক্স মানটির চিহ্নটি বজায় রাখে। এক্স নেতিবাচক হলে আপনি পরিসীমাটিতে ফলাফল পাবেন (-Y, 0]। এক্স ইতিবাচক হলে আপনি পরিসরের ফলাফল পাবেন [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 তে প্রদর্শিত সংক্ষিপ্ত আকারে উপস্থাপন করেছি O বিকল্প 1 এর ফর্মটিতে (এবং বিকল্প বিকল্প 3 এর) এ পুনরায় লেখার পাঠকের কাছে অনুশীলন হিসাবে রেখে দেওয়া হয়েছে। ;)

আশা করি এইটি কাজ করবে.


ধন্যবাদ রব এই বিভ্রান্তি প্রোগ্রামারদের ব্যাখ্যা করতে কীভাবে মডুলার গাণিতিক থেকে গাণিতিক বৈশিষ্ট্যগুলি সহ অ্যালগরিদমগুলি প্রয়োগ করতে পারে তা দারুণ অসুবিধা সৃষ্টি করে। অনুস্মারকটি মডিউলাস নয় তবে একজন খুব দ্রুত বাকিদের কাছ থেকে একটি মডুলাস অর্জন করতে পারে।
জিম

1
@ টিকলডপিংক বাদে এটি জাভাতে সংকলন করে না।
ইউজিন বেরেসভস্কি

33

নেতিবাচক এক্স এবং ধনাত্মক ওয়াইয়ের মানগুলির জন্য এমওডির মতো কাজ করার জন্য জাভার% (আরইএম) ক্রিয়াকলাপটি পেতে, আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন:

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

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


তবে আমি একজন সত্যিকারের মডুলো অপারেটর চাই যা নেতিবাচক পূর্ণসংখ্যার জন্য কাজ করে যাতে array[x mod array.length]অ্যালওয়েগুলি আমার অ্যারেতে কোনও উপাদান অ্যাক্সেস না করে নেতিবাচক অবস্থানগুলি সূচী করার চেষ্টা করে।
ক্রিস

2
(x % y + y) % y বা জাভা 8 এ শুরু হচ্ছেMath.floorMod(x, y)
গ্রেগ চার্লস

12

মানটি নেতিবাচক কিনা তা যাচাই করে যথাযথ মডিউলো করা সম্ভব হয় এবং এটি যদি (অনেকের পরামর্শ মতো) হয় তবে এটি আরও কমপ্যাক্ট সমাধান রয়েছে।

(a % b + b) % b

এটি প্রথমে মডিউলগুলি করবে, মানটি -b -> + b সীমাতে সীমাবদ্ধ করে এবং তারপরে বিটিকে যুক্ত করবে যাতে মানটি ইতিবাচক হয় তা নিশ্চিত করতে, পরবর্তী মডুলোটি এটি 0 -> বি সীমার মধ্যে সীমাবদ্ধ করে দেয়।

দ্রষ্টব্য: খ যদি নেতিবাচক হয় তবে ফলাফলটিও নেতিবাচক হবে


এ এবং বি উভয় বৃহত সংখ্যক হলে এটি উপচে পড়তে পারে, সুতরাং এটি সঠিক সমাধান নয়।
ট্রিক্সি ওল্ফ

11

কোডটি মডিউল ব্যবহার না করেই খুব দ্রুত চালিত হয়:

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

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

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

4
@ ল্লুইস মার্টিনিজ এটি কম্পিউটিংয়ের একটি সবচেয়ে বেশি ভুল বক্তব্য রয়েছে। পুরো উদ্ধৃতিটি হ'ল "প্রোগ্রামাররা তাদের প্রোগ্রামের অদ্বিতীয় অংশগুলির গতি সম্পর্কে চিন্তাভাবনা করে, বা উদ্বিগ্ন হয়, এবং ডিবাগিং এবং রক্ষণাবেক্ষণ বিবেচনা করার সময় দক্ষতার এই প্রচেষ্টাগুলি আসলে একটি শক্ত নেতিবাচক প্রভাব ফেলে We ছোট সম্পর্কে আমাদের ভুলে যাওয়া উচিত কার্যকারিতা, সময় সম্পর্কে প্রায় 97% বলুন: অকালীন অপ্টিমাইজেশন সমস্ত অশুভের মূল। তবুও আমাদের এই সমালোচনামূলক 3% তে আমাদের সুযোগগুলি অতিক্রম করা উচিত নয় "। যার অর্থ আসলে বেশ আলাদা কিছু।
লার্নের মারকুইস

3
@ ইজেপি আপনি সম্ভবত সঠিক আমি একটি পরীক্ষা করেছিলাম (1 মিলিয়ন পুনরাবৃত্তি সহ লুপ) 4000 ন্যানোসেকেন্ড নিয়ে মডুলোর সাথে, 2500 ন্যানোসেকেন্ড যুক্ত যুক্তিযুক্ত এবং সহ took
Lluis মার্টিনেজ

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


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
আপভোটেড, কারণ ফ্লোরডমড একটি ভাল 'মডুলো' অপারেটর %হিসাবে এটি আর্গুমেন্টটিও নেতিবাচক হওয়ার সময় এটি সঠিকভাবে কাজ করে। যুক্তিগুলি ইতিবাচক না হলে% অন্যান্য অস্বীকার অস্বীকার করার সাথে সাথে অন্য উত্তরগুলির কোনওটিই সঠিক নয় unless বিশেষত আপনি যদি প্রতিটি পূর্ণসংখ্যাকে একটি অ্যারেতে পরপর অবস্থানে মানচিত্র করতে চান array[floorMod(i, array.length)তবে সূচকটি iনেতিবাচক অঞ্চলে চলে গেলেও সঠিকভাবে কাজ করে। তাই না %
ক্রিস

3

এছাড়াও, মোড এইভাবে ব্যবহার করা যেতে পারে:

int a = 7;
b = a % 2;

bসমান হবে 1. কারণ 7 % 2 = 1


এটি প্রাথমিকভাবে এবং আউটপুট ছাড়াই কোনও উদাহরণে যৌগিক অপারেটরগুলি ব্যবহার করা ভুল।
স্টু থম্পসন

3

জাভার বাকী অপারেটর এবং %মডুলো অপারেটর হিসাবে প্রকাশ করা যেতে পারে

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

ঠিক ঠিক নয় ... এর জাবডোকটি 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বৃহত্তর মানের জন্য।
মার্টেন বোদেউয়েস

-1

মডুলো অপারেটরটি% (শতাংশ সাইন)। সান্নিধ্যের জন্য পরীক্ষা করতে বা সাধারণত 2 পাওয়ার পাওয়ারের জন্য মডুলো করতে, আপনি & যেমন (এবং এবং অপারেটর) যেমন ইভেন =! (একটি এবং 1) ব্যবহার করতে পারেন।


-3

@ কোডির কোডের বিকল্প:

মডুলাস অপারেটরটি ব্যবহার করে:

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

আমি মনে করি / অন্যথায় লেখার চেয়ে এটি প্রান্তিকভাবে ভাল কোড, কারণ এখানে অনুলিপি এবং অব্যবহৃত নমনীয়তা কম is এটি পরীক্ষা করতে আরও কিছুটা মস্তিষ্কের শক্তি প্রয়োজন, তবে isEvenক্ষতিপূরণ দেওয়ার ভাল নামকরণ ।


2
এটি একটি বাকি অপারেটর, কোনও মডুলাস অপারেটর নয়।
লার্নের মারকুইস

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