উত্তর:
অ-নেতিবাচক পূর্ণসংখ্যার জন্য সামান্য আলাদা শব্দার্থবিজ্ঞানযুক্ত মডুলো অপারেটরের পরিবর্তে, আপনি বাকী অপারেটরটি ব্যবহার করতে পারেন %
। আপনার সঠিক উদাহরণের জন্য:
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 প্রদান করে। ডাবল সমান (==) অপারেটরটি মানগুলির তুলনা করতে ব্যবহৃত হয়, যেমন এক জোড়া ints এবং একটি বুলিয়ান দেয়। এরপরে এটি বুলিয়ান ভেরিয়েবল 'isEven' এ নির্ধারিত হয়। অপারেটরের অগ্রাধিকারের ভিত্তিতে তুলনা করার আগে মডুলাসটি মূল্যায়ন করা হবে।
যেহেতু অন্য প্রত্যেকে ইতিমধ্যে উত্তর দিয়েছে তাই আমি কিছুটা অতিরিক্ত প্রসঙ্গ যুক্ত করব। % "মডুলাস" অপারেটর প্রকৃতপক্ষে অবশিষ্ট অপারেশন করছে। মোড এবং রেমের মধ্যে পার্থক্যটি সূক্ষ্ম তবে গুরুত্বপূর্ণ।
(-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 এর) এ পুনরায় লেখার পাঠকের কাছে অনুশীলন হিসাবে রেখে দেওয়া হয়েছে। ;)
আশা করি এইটি কাজ করবে.
নেতিবাচক এক্স এবং ধনাত্মক ওয়াইয়ের মানগুলির জন্য এমওডির মতো কাজ করার জন্য জাভার% (আরইএম) ক্রিয়াকলাপটি পেতে, আপনি এই পদ্ধতিটি ব্যবহার করতে পারেন:
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;
}
জাভাতে আসলে সি-তে কোনও মডুলো অপারেটর নেই। জাভাতে% একজন অবশিষ্ট অপারেটর। ধনাত্মক পূর্ণসংখ্যার উপর, এটি মডুলোর মতোই কাজ করে তবে এটি negativeণাত্মক পূর্ণসংখ্যার উপর ভিন্নভাবে কাজ করে এবং মডুলোর বিপরীতে ভাসমান পয়েন্ট সংখ্যাগুলির সাথেও কাজ করতে পারে। তবুও, ইতিবাচক পূর্ণসংখ্যার ব্যতীত অন্য কোনও ক্ষেত্রে% ব্যবহার করা বিরল, সুতরাং আপনি যদি এটিকে একটি মডুলো বলতে চান, তবে নির্দ্বিধায়!
array[x mod array.length]
অ্যালওয়েগুলি আমার অ্যারেতে কোনও উপাদান অ্যাক্সেস না করে নেতিবাচক অবস্থানগুলি সূচী করার চেষ্টা করে।
(x % y + y) % y
বা জাভা 8 এ শুরু হচ্ছেMath.floorMod(x, y)
মানটি নেতিবাচক কিনা তা যাচাই করে যথাযথ মডিউলো করা সম্ভব হয় এবং এটি যদি (অনেকের পরামর্শ মতো) হয় তবে এটি আরও কমপ্যাক্ট সমাধান রয়েছে।
(a % b + b) % b
এটি প্রথমে মডিউলগুলি করবে, মানটি -b -> + b সীমাতে সীমাবদ্ধ করে এবং তারপরে বিটিকে যুক্ত করবে যাতে মানটি ইতিবাচক হয় তা নিশ্চিত করতে, পরবর্তী মডুলোটি এটি 0 -> বি সীমার মধ্যে সীমাবদ্ধ করে দেয়।
দ্রষ্টব্য: খ যদি নেতিবাচক হয় তবে ফলাফলটিও নেতিবাচক হবে
কোডটি মডিউল ব্যবহার না করেই খুব দ্রুত চালিত হয়:
public boolean isEven(int a){
return ( (a & 1) == 0 );
}
public boolean isOdd(int a){
return ( (a & 1) == 1 );
}
if (a % 2 == 0) {
} else {
}
'অবশিষ্ট' অপারেটর% ব্যবহার করার আগে আপনার স্পেসিফিকেশন পরীক্ষা করা উচিত:
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
যা %
বিভিন্ন লক্ষণ সহ যুক্তির জন্য আলাদা ফলাফল দেয় :
%
হিসাবে এটি আর্গুমেন্টটিও নেতিবাচক হওয়ার সময় এটি সঠিকভাবে কাজ করে। যুক্তিগুলি ইতিবাচক না হলে% অন্যান্য অস্বীকার অস্বীকার করার সাথে সাথে অন্য উত্তরগুলির কোনওটিই সঠিক নয় unless বিশেষত আপনি যদি প্রতিটি পূর্ণসংখ্যাকে একটি অ্যারেতে পরপর অবস্থানে মানচিত্র করতে চান 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;
আমি মনে করি / অন্যথায় লেখার চেয়ে এটি প্রান্তিকভাবে ভাল কোড, কারণ এখানে অনুলিপি এবং অব্যবহৃত নমনীয়তা কম is এটি পরীক্ষা করতে আরও কিছুটা মস্তিষ্কের শক্তি প্রয়োজন, তবে isEven
ক্ষতিপূরণ দেওয়ার ভাল নামকরণ ।