Câu trả lời:
Thay vì toán tử modulo, có ngữ nghĩa hơi khác nhau, đối với các số nguyên không âm, bạn có thể sử dụng toán tử còn lại%
. Ví dụ chính xác của bạn:
if ((a % 2) == 0)
{
isEven = true;
}
else
{
isEven = false;
}
Điều này có thể được đơn giản hóa thành một lớp lót:
isEven = (a % 2) == 0;
%
được đánh giá trước ==
khi tôi tra cứu nó, vì vậy sẽ không rõ liệu biểu thức đó có tương đương với (a%2)==0
hay không a%(2==0)
. Tôi đoán nó ít quan trọng hơn trong java khi boolean không giống với số nguyên
Đây là cách trình bày mã giả của bạn trong mã Java tối thiểu;
boolean isEven = a % 2 == 0;
Bây giờ tôi sẽ chia nó thành các thành phần của nó. Toán tử mô đun trong Java là ký tự phần trăm (%). Do đó, lấy một int% int trả về một int khác. Toán tử double bằng (==) được sử dụng để so sánh các giá trị, chẳng hạn như một cặp số nguyên và trả về một giá trị boolean. Điều này sau đó được gán cho biến boolean 'isEven'. Dựa trên ưu tiên toán tử, mô đun sẽ được đánh giá trước khi so sánh.
Vì mọi người khác đã đưa ra câu trả lời, tôi sẽ thêm một chút bối cảnh bổ sung. % toán tử "mô-đun" thực sự đang thực hiện thao tác còn lại. Sự khác biệt giữa mod và rem là tinh tế, nhưng quan trọng.
(-1 mod 2) thường sẽ cung cấp 1. Cụ thể hơn, hai số nguyên X và Y, hoạt động (X mod Y) có xu hướng trả về một giá trị trong phạm vi [0, Y). Nói cách khác, mô đun của X và Y luôn lớn hơn hoặc bằng 0 và nhỏ hơn Y.
Thực hiện cùng một hoạt động với "%" hoặc toán tử rem duy trì dấu của giá trị X. Nếu X âm, bạn nhận được kết quả trong phạm vi (-Y, 0]. Nếu X dương, bạn nhận được kết quả trong phạm vi [0, Y).
Thường thì sự phân biệt tinh tế này không thành vấn đề. Quay trở lại câu hỏi mã của bạn, tuy nhiên, có nhiều cách giải quyết cho "sự đồng đều".
Cách tiếp cận đầu tiên là tốt cho người mới bắt đầu, bởi vì nó đặc biệt dài dòng.
// Option 1: Clearest way for beginners
boolean isEven;
if ((a % 2) == 0)
{
isEven = true
}
else
{
isEven = false
}
Cách tiếp cận thứ hai tận dụng lợi thế của ngôn ngữ tốt hơn và dẫn đến mã ngắn gọn hơn. (Đừng quên rằng toán tử == trả về boolean.)
// Option 2: Clear, succinct, code
boolean isEven = ((a % 2) == 0);
Cách tiếp cận thứ ba là ở đây để hoàn thiện và sử dụng toán tử ternary . Mặc dù toán tử ternary thường rất hữu ích, nhưng trong trường hợp này tôi coi cách tiếp cận thứ hai là vượt trội.
// Option 3: Ternary operator
boolean isEven = ((a % 2) == 0) ? true : false;
Cách tiếp cận thứ tư và cuối cùng là sử dụng kiến thức về biểu diễn nhị phân của số nguyên . Nếu bit có ý nghĩa nhỏ nhất là 0 thì số đó là số chẵn. Điều này có thể được kiểm tra bằng bitwise - và toán tử (&). Mặc dù cách tiếp cận này là nhanh nhất (bạn đang thực hiện mặt nạ bit đơn giản thay vì chia), nhưng có lẽ nó hơi tiên tiến / phức tạp đối với người mới bắt đầu.
// Option 4: Bitwise-and
boolean isEven = ((a & 1) == 0);
Ở đây tôi đã sử dụng toán tử bitwise và toán tử, và biểu diễn nó ở dạng cô đọng được hiển thị trong tùy chọn 2. Viết lại nó ở dạng của Tùy chọn 1 (và thay vào đó là Tùy chọn 3) để lại cho người đọc. ;)
Mong rằng sẽ giúp.
Để làm cho hoạt động% (REM) của Java hoạt động như MOD cho các giá trị X âm và Y dương, bạn có thể sử dụng phương thức này:
private int mod(int x, int y)
{
int result = x % y;
if (result < 0)
{
result += y;
}
return result;
}
hoặc với toán tử ternary (ngắn hơn, nhưng không thể hoặc kém hiệu quả hơn trong một số trường hợp):
private int mod(int x, int y)
{
int result = x % y;
return result < 0? result + y : result;
}
Java thực sự không có toán tử modulo theo cách C làm. % trong Java là toán tử còn lại. Trên các số nguyên dương, nó hoạt động chính xác như modulo, nhưng nó hoạt động khác với các số nguyên âm và, không giống như modulo, cũng có thể hoạt động với các số dấu phẩy động. Tuy nhiên, thật hiếm khi sử dụng% cho bất cứ thứ gì ngoại trừ số nguyên dương, vì vậy nếu bạn muốn gọi nó là modulo, thì cứ thoải mái!
array[x mod array.length]
luôn luôn truy cập một phần tử trong mảng của tôi thay vì cố gắng lập chỉ mục các vị trí phủ định.
(x % y + y) % y
hoặc bắt đầu ở Java 8,Math.floorMod(x, y)
Mặc dù có thể thực hiện một modulo thích hợp bằng cách kiểm tra xem giá trị có âm hay không và sửa nó nếu đúng (theo cách mà nhiều người đã đề xuất), có một giải pháp nhỏ gọn hơn.
(a % b + b) % b
Điều này trước tiên sẽ thực hiện modulo, giới hạn giá trị trong phạm vi -b -> + b và sau đó thêm b để đảm bảo giá trị là dương, hãy để modulo tiếp theo giới hạn ở phạm vi 0 -> b.
Lưu ý: Nếu b âm tính, kết quả cũng sẽ âm
Mã chạy nhanh hơn nhiều mà không cần sử dụng modulo:
public boolean isEven(int a){
return ( (a & 1) == 0 );
}
public boolean isOdd(int a){
return ( (a & 1) == 1 );
}
bạn nên kiểm tra thông số kỹ thuật trước khi sử dụng toán tử 'phần còn lại'%:
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);
Trong Java, nó là %
toán tử:
15.17.3. Toán tử còn lại%
Lưu ý rằng cũng có floorMod
trong java.lang.Math
lớp sẽ cho kết quả khác với %
các đối số có dấu hiệu khác nhau:
%
vì nó cũng hoạt động đúng khi đối số cũng âm. Không có câu trả lời nào khác thực sự đúng vì chúng đi kèm với tuyên bố từ chối trách nhiệm rằng% không thực sự là modulo trừ khi các đối số là tích cực. Cụ thể, nếu bạn muốn ánh xạ mọi số nguyên sang một vị trí liên tiếp trong một mảng thì array[floorMod(i, array.length)
hoạt động chính xác ngay cả khi chỉ mục i
đi vào lãnh thổ âm. Không như vậy với %
.
Ngoài ra, mod có thể được sử dụng như thế này:
int a = 7;
b = a % 2;
b
sẽ bằng 1. Bởi vì 7 % 2 = 1
.
Như những người khác đã chỉ ra, %
toán tử (phần còn lại) không giống như toán tử mod
/ hàm hoạt động mô đun toán học
.
mod
đấu với%
Các
x mod n
chức năng ánh xạx
đếnn
trong phạm vi[0,n)
.
Trong khi cácx % n
nhà điều hành ánh xạx
đếnn
trong phạm vi(-n,n)
.
Để có một phương pháp sử dụng hoạt động mô đun toán học và không quan tâm đến dấu hiệu phía trước x
người ta có thể sử dụng:
((x % n) + n) % n
Có lẽ hình ảnh này giúp hiểu rõ hơn về nó (tôi đã có một khoảng thời gian khó khăn trong đầu này)
int
chính biến đó. Các floorMod
phương pháp không làm điều đó một cách chính xác (nhưng bạn có thể cần phải tính toán bổ sung nếu n
là tiêu cực).
Trong Java
, hoạt động mod có thể được thực hiện như sau:
Math.floorMod(a, b)
Lưu ý:
Các mod hoạt động khác với phần còn lại hoạt động. Trong Java
, hoạt động còn lại có thể được thực hiện như sau:
a % b
Math.floorMod()
có nó: 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).
Vì vậy, nó không hoàn toàn giống như mô đun toán học. Nhưng , có một cách để có được kết quả tích cực, cũng trong Javadoc của cùng một phương pháp: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
hoạt động sẽ hoạt động như mong đợi. Cũng có floorMod
cho long
giá trị và nếu không có sự BigInteger
cho các giá trị lớn hơn.
Một thay thế cho mã từ @Cody:
Sử dụng toán tử mô đun:
bool isEven = (a % 2) == 0;
Tôi nghĩ rằng đây là mã tốt hơn so với viết if / other, bởi vì có ít sự trùng lặp & linh hoạt không sử dụng. Nó đòi hỏi một chút năng lực não bộ để kiểm tra, nhưng việc đặt tên tốt cho sự isEven
bù trừ.