เป็นตัวอย่างใน pseudocode:
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
เป็นตัวอย่างใน pseudocode:
if ((a mod 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
คำตอบ:
แทนของผู้ประกอบการโมดูโลซึ่งมีความหมายแตกต่างกันเล็กน้อยสำหรับจำนวนเต็มไม่เป็นลบ, คุณสามารถใช้ที่เหลือ%
ผู้ประกอบการ สำหรับตัวอย่างที่แน่นอนของคุณ:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
สิ่งนี้สามารถทำให้เป็นหนึ่งซับได้ง่าย:
isEven = (a % 2) == 0;
%
ได้รับการประเมินก่อน==
ก่อนที่ผมมองมันขึ้นดังนั้นมันจะไม่ชัดเจนว่าการแสดงออกเทียบเท่ากับหรือ(a%2)==0
a%(2==0)
ฉันเดาว่ามันมีความสำคัญน้อยกว่าใน java ที่บูลีนไม่เหมือนกับเลขจำนวนเต็ม
นี่เป็นตัวแทนของรหัสเทียมของคุณในรหัส Java น้อยที่สุด;
boolean isEven = a % 2 == 0;
ตอนนี้ฉันจะแยกมันออกเป็นส่วนประกอบ ตัวดำเนินการโมดูลัสใน Java คืออักขระเปอร์เซ็นต์ (%) ดังนั้นการรับ int% int จะส่งคืน int อื่น ตัวดำเนินการ double equals (==) ถูกใช้เพื่อเปรียบเทียบค่าเช่นคู่ของ int และส่งคืนบูลีน นี่จะถูกกำหนดให้กับตัวแปรบูลีน 'isEven' ขึ้นอยู่กับความสำคัญของผู้ประกอบการโมดูลัสจะถูกประเมินก่อนการเปรียบเทียบ
เนื่องจากคนอื่นให้คำตอบแล้วฉันจะเพิ่มบริบทเพิ่มเติมเล็กน้อย % ตัวดำเนินการ "โมดูลัส" กำลังทำการดำเนินการส่วนที่เหลือ ความแตกต่างระหว่าง mod และ rem นั้นบอบบาง แต่สำคัญ
(-1 mod 2) โดยปกติแล้วจะให้ 1 โดยเฉพาะอย่างยิ่งที่ได้รับสองจำนวนเต็ม X และ Y การดำเนินการ (X mod Y) มีแนวโน้มที่จะกลับค่าในช่วง [0, Y) กล่าวว่าแตกต่างกันโมดูลัสของ X และ Y มักจะมากกว่าหรือเท่ากับศูนย์และน้อยกว่า Y
ทำการดำเนินการเดียวกันกับ "%" หรือตัวดำเนินการ rem จะรักษาเครื่องหมายของค่า X ถ้า X เป็นลบคุณจะได้ผลลัพธ์ในช่วง (-Y, 0] ถ้า X เป็นบวกคุณจะได้ผลลัพธ์ในช่วง [0, Y)
บ่อยครั้งที่ความแตกต่างที่ลึกซึ้งนี้ไม่สำคัญ กลับไปที่คำถามรหัสของคุณแม้ว่าจะมีวิธีการแก้ปัญหาหลายวิธีสำหรับ "สมดุล"
วิธีแรกเป็นวิธีที่ดีสำหรับผู้เริ่มต้นเพราะโดยเฉพาะอย่างยิ่ง verbose
// 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 ของ) จะเหลือเป็นแบบฝึกหัดให้ผู้อ่าน ;)
หวังว่าจะช่วย
ในการทำให้การดำเนินการ% (REM) ของ Java ทำงานเช่น MOD สำหรับค่าลบ X และค่าบวก Y คุณสามารถใช้วิธีนี้:
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;
}
Java ไม่มีตัวดำเนินการแบบโมดูโลเหมือนกับที่ C ทำ % ใน Java เป็นตัวดำเนินการส่วนที่เหลือ สำหรับจำนวนเต็มบวกมันทำงานเหมือนกับโมดูโล แต่มันทำงานต่างกันในจำนวนเต็มลบและไม่เหมือนกับโมดูโลที่สามารถทำงานกับเลขทศนิยมได้เช่นกัน ถึงกระนั้นมันก็ยากที่จะใช้% กับอะไรก็ได้ยกเว้นจำนวนเต็มบวกดังนั้นถ้าคุณต้องการเรียกมันว่าโมดูโลแล้วรู้สึกฟรี!
array[x mod array.length]
เข้าถึงองค์ประกอบในอาร์เรย์ของฉันแทนที่จะพยายามทำดัชนีตำแหน่งเชิงลบ
(x % y + y) % y
หรือเริ่มใน Java 8,Math.floorMod(x, y)
ในขณะที่เป็นไปได้ที่จะทำแบบโมดูโลที่เหมาะสมโดยตรวจสอบว่าค่าเป็นลบและแก้ไขถ้าเป็น (วิธีที่หลายคนแนะนำ) มีวิธีแก้ไขปัญหาที่กะทัดรัดกว่า
(a % b + b) % b
สิ่งนี้จะทำการโมดูโลก่อนการ จำกัด ค่าในช่วง -b -> + b แล้วเพิ่ม b เพื่อให้แน่ใจว่าค่าเป็นบวกปล่อยโมดูโลต่อไป จำกัด ให้อยู่ในช่วง 0 -> b
หมายเหตุ: ถ้า b เป็นลบผลลัพธ์จะเป็นลบเช่นกัน
รหัสทำงานเร็วขึ้นมากโดยไม่ต้องใช้โมดูโล:
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);
ใน Java เป็น%
ผู้ดำเนินการ:
15.17.3 ผู้ประกอบการที่เหลืออยู่%
โปรดทราบว่ายังมีfloorMod
ในjava.lang.Math
ชั้นเรียนซึ่งจะให้ผลลัพธ์ที่แตกต่างจาก%
การขัดแย้งกับสัญญาณที่แตกต่างกัน:
%
เนื่องจากมันทำงานได้อย่างถูกต้องเมื่ออาร์กิวเมนต์เป็นค่าลบเช่นกัน ไม่มีคำตอบอื่นใดที่ถูกต้องจริง ๆ เนื่องจากพวกเขามาพร้อมกับข้อจำกัดความรับผิดชอบที่% นั้นไม่โมดูโล่จริง ๆ เว้นแต่ว่าข้อโต้แย้งนั้นจะเป็นบวก โดยเฉพาะอย่างยิ่งถ้าคุณต้องการแมปจำนวนเต็มทุกตำแหน่งไปยังตำแหน่งต่อเนื่องในอาร์เรย์แล้วarray[floorMod(i, array.length)
ทำงานอย่างถูกต้องแม้ว่าดัชนีi
จะเข้าสู่พื้นที่เชิงลบ %
ไม่ให้มี
นอกจากนี้ mod ยังสามารถใช้ดังนี้:
int a = 7;
b = a % 2;
b
จะเท่ากับ 1 7 % 2 = 1
เนื่องจาก
ตัวดำเนินการส่วนที่เหลือใน Java คือ%
และตัวดำเนินการ 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;
}
ดังที่คนอื่น ๆ ได้ชี้ให้เห็นตัวดำเนินการ%
(ส่วนที่เหลือ) นั้นไม่เหมือนกับการmod
ดำเนินงาน / ฟังก์ชันโมดูลัสทางคณิตศาสตร์
mod
VS%
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;
กด Like @Steve Kuo
ในJava
การดำเนินการmodสามารถทำได้ดังนี้:
Math.floorMod(a, b)
หมายเหตุ:
การดำเนินการmodจะแตกต่างจากการดำเนินการส่วนที่เหลือ ใน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).
ดังนั้นมันจึงไม่เหมือนกับโมดูลัสทางคณิตศาสตร์ แต่มีวิธีการรับผลบวกใน Javadoc ของวิธีการเดียวกัน: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
มีค่าที่ใหญ่กว่า
ตัวดำเนินการ modulo คือ% (เครื่องหมายเปอร์เซ็นต์) เพื่อทดสอบความสมดุลหรือโดยทั่วไปทำโมดูโลสำหรับกำลัง 2 คุณยังสามารถใช้ & (และและตัวดำเนินการ) เช่น isEven =! (a & 1)
ทางเลือกสำหรับรหัสจาก @Cody:
การใช้ตัวดำเนินการโมดูลัส:
bool isEven = (a % 2) == 0;
ฉันคิดว่านี่เป็นโค้ดที่ดีกว่าการเขียนถ้า / อย่างอื่นเนื่องจากมีการทำซ้ำน้อยลงและมีความยืดหยุ่นที่ไม่ได้ใช้ มันต้องการพลังสมองมากขึ้นในการตรวจสอบ แต่การตั้งชื่อที่ดีของการisEven
ชดเชย