Hãy nói về các hoạt động trong Java: số, logic, bitwise. Đây là cơ sở lý thuyết chắc chắn cần thiết để học cách lập trình.
Bảng 1. Các toán tử số học nhị phân
Bốn toán tử đầu tiên không nên đặt ra bất kỳ câu hỏi nào: mọi thứ đều giống như trong toán học. Toán tử cuối cùng, phần còn lại của phép chia, cũng không làm gì quá phức tạp. Ví dụ: nếu chia 24 cho 7, chúng ta được 3 số nguyên và 3 số dư. Phần còn lại mà toán tử này sẽ trả về:
Ngoài các toán tử nhị phân, Java còn có các toán tử số học đơn phân.
Bảng 2. Các toán tử số học một ngôi:
Ví dụ về cộng và trừ đơn nguyên:
Các thao tác tăng giảm về cơ bản là đơn giản. Trong trường hợp đầu tiên, biến được tăng thêm 1, trong trường hợp thứ hai, biến giảm đi 1. Ví dụ dưới đây:
Bảng 3. Toán tử tăng giảm:
Trình diễn:
Ngoài số học còn có các phép tính so sánh (của hai số). Kết quả sẽ luôn đúng hoặc sai ( true / false ).
Bảng 4. Toán tử so sánh
Ví dụ:
Bảng 5. Bảng chân lý của toán tử phủ định (NOT)
Bảng 6. Bảng chân trị của toán tử kết hợp (AND)
Bảng 7. Bảng chân trị của toán tử tách (OR)
Bảng 8. Bảng chân trị của toán tử cộng modulo (XOR)
Java có các hoạt động logic tương tự:
Và với
Bây giờ, chúng ta có các toán tử tốc ký (
Đôi khi kết quả của một biểu thức có thể được tính từ toán hạng đầu tiên. Đây là điểm phân biệt các toán tử viết tắt
Trong trường hợp toán tử tốc ký, phần thứ hai của biểu thức không được đánh giá. Nhưng điều này chỉ xảy ra khi kết quả của biểu thức đã rõ ràng từ toán hạng đầu tiên.
Hãy chứng minh cách đếm từ 0 đến 15 ở dạng thập phân và nhị phân:
Như bạn có thể thấy, mọi thứ không quá phức tạp. Ngoài bit, còn có các đơn vị thông tin quen thuộc khác - byte , kilobyte , megabyte , gigabyte , v.v. Bạn có thể biết rằng có 8 bit trong 1 byte . Nó có nghĩa là gì? Điều này có nghĩa là 8 bit liên tiếp chiếm 1 byte. Dưới đây là ví dụ về byte có thể là gì:
Thì đấy - nó không phức tạp lắm. Nhưng vẫn có điều gì đó cần được làm rõ.
Hãy xem xét điều này bằng cách sử dụng số 8 bit làm ví dụ:
Cách tiếp cận rất đơn giản và về nguyên tắc, dễ hiểu. Tuy nhiên nó có nhược điểm: khó khăn khi thực hiện các phép toán. Ví dụ, với việc cộng các số âm và số dương. Chúng không thể được gấp lại trừ khi thực hiện các thao tác bổ sung.
Ở dòng đầu tiên, chúng ta nhận được giá trị trong hệ thống số nhị phân không có số 0 đứng đầu. Mặc dù chúng ta không nhìn thấy chúng nhưng chúng vẫn ở đó. Điều này được chứng minh bằng dòng thứ hai, trong đó tất cả các bit được chuyển thành bit ngược lại. Đây là lý do tại sao chúng tôi thấy rất nhiều đơn vị dẫn đầu. Đây là những số 0 đứng đầu trước đây đã bị trình biên dịch bỏ qua khi in trên dòng đầu tiên. Đây là một chương trình nhỏ cũng hiển thị các số 0 ở đầu cho rõ ràng.
Hiện nay. Bạn có thể nói gì về những con số được dịch chuyển sang bên phải? Chúng chia hết cho 2. Mỗi lần dịch chuyển một bit sang phải, chúng ta chia số ban đầu cho 2. Nếu số đó không chia hết cho 2 thì kết quả sẽ được làm tròn về âm vô cực (xuống). Nhưng điều này chỉ có tác dụng nếu chúng ta dịch số bit đi đúng 1. Và nếu bằng 2 bit, chia cho 4. Cho 3 bit, chia cho 8. Cho 4 bit, chia cho 16. Thấy không? lũy thừa của 2... Khi chúng ta dịch một số
- Các loại toán tử trong Java là gì?
- Toán tử Java trong khóa học JavaRush
- Các phép toán số trong Java
- Các hoạt động logic trong Java
- Hoạt động bitwise trong Java
- Mức độ ưu tiên của các hoạt động trong Java
- Ví dụ hữu ích về việc sử dụng
Các loại toán tử trong Java là gì?
Đối với bất kỳ hoạt động nào, chúng ta cần ít nhất hai thứ:- nhà điều hành;
- toán hạng.
Toán tử Java trong khóa học JavaRush
Một số bài giảng được dành cho các toán tử Java ở cấp độ thứ tư của nhiệm vụ đầu tiên - Cú pháp Java. Đặc biệt, các toán tử có điều kiện như boolean . Khóa học bao gồm 22 nhiệm vụ sẽ giúp bạn hiểu công việc của các toán tử so sánh, toán tử điều kiện và toán tử logic.Các phép toán số trong Java
Thao tác phổ biến nhất mà người lập trình thực hiện trên các số là gán giá trị số cho một biến. Cô ấy, giống như người điều hành,=
quen thuộc với bạn:
int a = 1;
int b = 2;
int c = 3;
Ngoài ra còn có các phép toán số học. Chúng được thực hiện bằng cách sử dụng các toán tử số học nhị phân:
System.out.println(24 % 7); // prints 3
Dưới đây là ví dụ từ trang tài liệu chính thức của Oracle: Chương trình này sẽ xuất ra kết quả như sau: 1 + 2 = 3 3 - 1 = 2 2 * 2 = 4 4 / 2 = 2 2 + 8 = 10 10 % 7 = 3 Java cho phép bạn để kết hợp: ví dụ: phép gán toán tử và toán tử số học. Hãy xem một ví dụ:
int x = 0;
x = x + 1; // x = 0 + 1 => x = 1
x = x + 1; // x = 1 + 1 => x = 2
x = x + 1; // x = 2 + 1 => x = 3
Ở đây chúng ta đã xác định một biến x
và gán cho nó giá trị bằng 0. Tiếp theo, ở mỗi dòng chúng ta gán một giá trị x
bằng tổng giá trị hiện tại của biến x
và một. Có giải thích ở phần bình luận cho từng dòng. Thủ tục này được gọi là tăng hoặc tăng một biến. Phép toán tăng dần từ ví dụ trên có thể được thay thế bằng một phép toán tương tự bằng cách sử dụng kết hợp các toán tử:
int x = 0;
x += 1; // x = 0 + 1 => x = 1
x += 1; // x = 1 + 1 => x = 2
x += 1; // x = 2 + 1 => x = 3
Bạn có thể kết hợp toán tử gán với bất kỳ toán tử số học nào:
int x = 0;
x += 10; // x = 0 + 10 => x = 10
x -= 5; // x = 10 - 5 => x = 5
x *= 5; // x = 5 * 5 => x = 25
x /= 5; // x = 25 / 5 => x = 5
x %= 3; // x = 5 % 3 => x = 2;
Hãy chứng minh cách hoạt động của ví dụ cuối cùng:
int x = 0;
x = (+5) + (+15); // Parentheses for clarity, it is possible without them
System.out.println("x = " + x);
int y = -x;
System.out.println("y = " + y);
int x = 9;
x++;
System.out.println(x); // 10
int y = 21;
y--;
System.out.println(y); // 20
Có hai loại hoạt động này - postfix và tiền tố. Trong trường hợp đầu tiên, toán tử được viết sau biến, trong trường hợp thứ hai, trước biến. Sự khác biệt duy nhất là khi thao tác tăng hoặc giảm được thực hiện. Ví dụ và mô tả trong bảng dưới đây. Giả sử chúng ta có một biến:
int a = 2;
Sau đó:
int a = 1;
int b = 2;
boolean comparisonResult = a == b;
System.out.println("a == b :" + comparisonResult);
comparisonResult = a != b;
System.out.println("a != b :" + comparisonResult);
comparisonResult = a > b;
System.out.println("a > b :" + comparisonResult);
comparisonResult = a >= b;
System.out.println("a >= b :" + comparisonResult);
comparisonResult = a < b;
System.out.println("a < b :" + comparisonResult);
comparisonResult = a <= b;
System.out.println("a <= b :" + comparisonResult);
Trình diễn:
Các hoạt động logic trong Java
Chúng ta hãy xem xét các phép toán logic và bảng chân lý của từng chúng:- phép toán phủ định (
NOT
); - phép toán kết hợp, logic AND (
AND
); - phép tách, logic OR (
OR
); - phép cộng modulo, loại trừ OR (
XOR
).
!
- toán tử phủ định;&&
- toán tử logic AND (ngắn);||
- toán tử logic OR (ngắn);&
- toán tử AND theo bit;|
- toán tử OR theo bit;^
- toán tử OR độc quyền theo bit.
public class LogicDemo {
public static void main(String[] args) {
notExample();
andExample();
orExample();
xorExample();
}
public static void notExample() {
System.out.println("NOT EXAMPLE:");
System.out.println("NOT false = " + !false);
System.out.println("NOT true = " + !true);
System.out.println();
}
public static void andExample() {
System.out.println("AND EXAMPLE:");
System.out.println("false AND false = " + (false & false));
System.out.println("false AND true = " + (false & true));
System.out.println("true AND false = " + (true & false));
System.out.println("true AND true = " + (true & true));
System.out.println();
}
public static void orExample() {
System.out.println("OR EXAMPLE:");
System.out.println("false OR false = " + (false | false));
System.out.println("false OR true = " + (false | true));
System.out.println("true OR false = " + (true | false));
System.out.println("true OR true = " + (true | true));
System.out.println();
}
public static void xorExample() {
System.out.println("XOR EXAMPLE:");
System.out.println("false XOR false = " + (false ^ false));
System.out.println("false XOR true = " + (false ^ true));
System.out.println("true XOR false = " + (true ^ false));
System.out.println("true XOR true = " + (true ^ true));
System.out.println();
}
}
Chương trình này sẽ hiển thị: KHÔNG VÍ DỤ: KHÔNG sai = đúng KHÔNG đúng = sai VÀ VÍ DỤ: sai VÀ sai = sai sai VÀ đúng = sai đúng VÀ sai = sai đúng VÀ đúng = đúng HOẶC VÍ DỤ: sai HOẶC sai = sai sai HOẶC đúng = true true OR false = true true OR true = true XOR VÍ DỤ: false XOR false = false false XOR true = true true XOR false = true true XOR true = false Toán tử logic chỉ áp dụng cho boolean
các biến. Trong trường hợp của chúng tôi, chúng tôi đã áp dụng chúng trực tiếp cho các giá trị, nhưng bạn cũng có thể sử dụng chúng với boolean
các biến:
boolean
các biểu thức:
&&
, ||
) và các toán tử bitwise tương tự ( &
, |
). sự khác biệt giữa chúng là gì? Đầu tiên, bitwise có thể được áp dụng cho số nguyên. Chúng ta sẽ nói về điều này một lát sau. Và thứ hai, một số được viết tắt, trong khi một số khác thì không. Để hiểu chữ viết tắt trông như thế nào, chúng ta hãy nhìn vào biểu thức:
false AND x = ?
true OR x = ?
Điều này x
có thể nhận bất kỳ giá trị Boolean nào. Và nói chung, theo quy luật của bảng logic và chân lý, bất kể nó x
đúng hay sai thì kết quả của biểu thức thứ nhất sẽ là sai , và kết quả của biểu thức thứ hai sẽ là đúng . Nhìn.
&&
và ||
. Trong các biểu thức tương tự như mô tả ở trên, chúng không đánh giá giá trị của toán hạng thứ hai. Đây là một ví dụ nhỏ:
Hoạt động bitwise trong Java
Chà, ở đây chúng ta đến phần thú vị nhất: các phép toán theo bit. Như tên cho thấy, đây là những thao tác được thực hiện trên bit. Nhưng trước khi đi sâu vào chủ đề này, cần nói về các lĩnh vực liên quan.Biểu diễn số trong hệ nhị phân
Các số, giống như bất kỳ thông tin nào khác trong chương trình, được lưu trữ trong bộ nhớ máy tính ở dạng mã nhị phân. Mã nhị phân là một tập hợp các số không và số một. Mỗi số 0 hoặc một đại diện cho một đơn vị thông tin gọi là bit.Theo Wikipedia:
Bit (từ chữ số nhị phân trong tiếng Anh - số nhị phân; cũng là cách chơi chữ: bit - mảnh, hạt trong tiếng Anh) là đơn vị đo lượng thông tin. 1 bit thông tin là một ký hiệu hoặc tín hiệu có thể mang hai nghĩa: bật hoặc tắt, có hoặc không, cao hay thấp, tích điện hoặc không tích điện; trong hệ nhị phân nó là 1 (một) hoặc 0 (không).Toán tử bitwise làm việc với loại dữ liệu nào?
Các phép toán bitwise trong Java chỉ được thực hiện trên các số nguyên. Các số nguyên được lưu trữ trong bộ nhớ máy tính dưới dạng tập hợp các bit. Chúng ta có thể nói rằng một máy tính chuyển đổi bất kỳ thông tin nào thành hệ thống số nhị phân (một tập hợp bit) và chỉ sau đó tương tác với nó. Nhưng hệ thống số nhị phân hoạt động như thế nào? Trong hệ thập phân chúng ta chỉ có 10 ký hiệu: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Chúng ta dùng các ký hiệu này để đếm. Sau 9 đến 10, sau 19 - 20, sau 99 - 100, sau 749 - 750. Tức là chúng ta sử dụng kết hợp 10 ký hiệu có sẵn và có thể sử dụng chúng để đếm “từ 0 đến bữa trưa”. Trong hệ thống số nhị phân, thay vì mười ký hiệu thì chỉ có hai - 0, 1. Nhưng bằng cách kết hợp các ký hiệu này theo nguyên tắc giống như trong hệ thập phân, chúng ta có thể đếm vô thời hạn.
00000000 - 1 byte
10110010 - 1 byte
01011011 - 1 byte
Số lượng các tổ hợp bit không lặp lại có thể có trong một byte là 256 (2 8 = 256). Nhưng hãy quay lại gần hơn với Java. Có một kiểu dữ liệu số nguyên như vậy - byte
. Loại này có thể lấy các giá trị từ -128 đến 127 và một số trong bộ nhớ máy tính chiếm đúng 8 bit, hay 1 byte. Một số loại này chiếm đúng 1 byte
bộ nhớ máy tính. Và ở đây những cái tên trùng khớp không phải ngẫu nhiên. Như chúng ta nhớ, 1 byte có thể lưu trữ 256 giá trị khác nhau. Và một loại số byte
có thể mang 256 giá trị khác nhau (128 âm, 127 dương và 1 số 0). Mỗi giá trị số byte
có một bộ tám bit duy nhất. Đây là trường hợp không chỉ với loại byte
mà còn với tất cả các loại tích phân. Loại byte
được đưa ra làm ví dụ là loại nhỏ nhất. Bảng bên dưới hiển thị tất cả các kiểu số nguyên Java và không gian bộ nhớ mà chúng chiếm giữ: Hãy xem xét kiểu int
. Nó có thể lưu trữ 2147483648 giá trị âm, 2147483647 giá trị dương và một giá trị 0. Tổng cộng:
2147483648 + 2147483647 + 1 = 4294967296.
Loại này chiếm 32 bit trong bộ nhớ máy tính. Số cách kết hợp có thể có từ một bộ gồm 32 số 0 và 1 là:
232 = 4294967296.
Cùng một số với số lượng giá trị mà loại có thể chứa int
. Đây chỉ là minh chứng cho mối quan hệ giữa phạm vi giá trị của một kiểu dữ liệu và kích thước của nó (số bit trong bộ nhớ). Bất kỳ số nào thuộc bất kỳ loại nào trong Java đều có thể được chuyển đổi thành nhị phân. Hãy xem việc này có thể được thực hiện dễ dàng như thế nào bằng ngôn ngữ Java. Chúng ta sẽ học từ ví dụ về type int
. Loại này có lớp bao bọc riêng - Integer
. Và anh ấy có một toBinaryString
, sẽ làm tất cả công việc cho chúng tôi:
int
số này mất 32 bit. Nhưng khi in số 10 trong ví dụ trên, chúng ta thấy 1010 trong bảng điều khiển. Điều này là do các số 0 đứng đầu không được in. Nếu chúng được hiển thị, thay vì 1010, chúng ta sẽ thấy trong bảng điều khiển 00000000000000000000000000000001010. Nhưng để dễ nhận biết, tất cả các số 0 đứng đầu đều bị bỏ qua. Không khó lắm cho đến khi bạn tự hỏi: còn số âm thì sao? Nó chỉ nhận biết thông tin trong hệ thống nhị phân. Hóa ra dấu trừ cũng cần phải được viết bằng mã nhị phân. Điều này có thể được thực hiện bằng cách sử dụng mã trực tiếp hoặc mã bổ sung.
Mã trực tiếp
Một phương pháp biểu diễn số trong hệ thống số nhị phân, trong đó bit có trọng số cao nhất (bit ngoài cùng bên trái) được gán cho dấu của số đó. Nếu số dương, bit ngoài cùng bên trái được ghi 0, nếu âm - 1.Mã bổ sung
Bằng cách sử dụng mã bổ sung, bạn có thể tránh được nhược điểm của mã trực tiếp. Có một thuật toán đơn giản để lấy mã bổ sung của một số. Hãy thử lấy mã bổ sung cho số -5. Hãy biểu diễn số này bằng mã bù hai trong hệ thống số nhị phân. Bước 1. Chúng ta thu được biểu diễn số âm bằng mã trực tiếp. Đối với -5 sẽ là 10000101. Bước 2. Đảo ngược tất cả các chữ số ngoại trừ chữ số dấu. Hãy thay thế tất cả số 0 bằng số 1 và số 0 bằng số 0 ở mọi nơi ngoại trừ bit ngoài cùng bên trái.
10000101 => 11111010
Bước 3. Thêm một vào giá trị kết quả:
11111010 + 1 = 11111011
Sẵn sàng. Chúng tôi nhận được giá trị -5 trong hệ thống số nhị phân bằng cách sử dụng mã bù hai. Điều này rất quan trọng để hiểu nội dung sau, vì Java sử dụng mã bù hai để lưu trữ số âm theo bit.
Các loại hoạt động bitwise
Bây giờ chúng ta đã giải quyết xong tất cả phần giới thiệu, hãy nói về các thao tác bitwise trong Java. Phép toán theo bit được thực hiện trên số nguyên và kết quả của nó là số nguyên. Trong quá trình này, số được chuyển đổi thành nhị phân, một thao tác được thực hiện trên mỗi bit và kết quả được chuyển đổi trở lại thành số thập phân. Danh sách các thao tác nằm trong bảng bên dưới: Như chúng ta đã biết, các số có thể được biểu diễn dưới dạng một tập hợp bit. Các thao tác theo bit thực hiện các thao tác trên chính xác từng bit của biểu diễn như vậy. Hãy lấyNOT
, AND
, OR
, XOR
. Hãy nhớ lại rằng gần đây chúng ta chỉ xem xét các bảng chân trị cho các toán hạng logic. Trong trường hợp này, các thao tác tương tự được áp dụng cho từng bit của số nguyên.
Toán tử đơn nguyên bitwise NOT ~
Toán tử này thay thế tất cả số 0 bằng số 1 và tất cả số 1 bằng số 0. Giả sử chúng ta có số 10 ở dạng thập phân. Trong hệ nhị phân, số này là 1010. Nếu chúng ta áp dụng toán tử phủ định bitwise đơn phương cho số này, chúng ta sẽ nhận được kết quả như thế này: Chúng ta hãy xem nó trông như thế nào trong mã Java:public static void main(String[] args) {
int a = 10;
System.out.println(" a = " + a + "; binary string: " + Integer.toBinaryString(a));
System.out.println("~a = " + ~a + "; binary string: " + Integer.toBinaryString(~a));
}
Bây giờ hãy xem những gì được hiển thị trong bảng điều khiển:
Toán tử bitwise AND
Toán tử này áp dụng cho hai số. Nó thực hiện một thao tácAND
giữa các bit của mỗi số. Hãy xem một ví dụ: Thao tác này được thực hiện trên hai số. Ví dụ trong mã Java:
Toán tử bitwise OR
HOẶC áp dụng cho hai số. Nó thực hiện phép toán OR giữa các bit của mỗi số: Bây giờ chúng ta hãy xem nó trông như thế nào trong IDEA:Hoạt động theo bit, OR (XOR) độc quyền
Hãy xem cùng một ví dụ, nhưng với một thao tác mới: Mã ví dụ:Dịch chuyển bit sang trái
Toán tử này áp dụng được cho hai toán hạng, tức là trong phép toánx << y
, các bit của số x
sẽ dịch chuyển y
vị trí sang trái. Nó có nghĩa là gì? Hãy xem ví dụ về phép tính, 10 << 1
kết quả của phép tính sẽ là số 20 trong hệ thập phân. Như bạn có thể thấy từ sơ đồ trên, tất cả các bit được dịch chuyển sang trái 1. Trong quá trình thực hiện thao tác này, giá trị của bit quan trọng nhất (bit ngoài cùng bên trái) sẽ bị mất. Và bit có trọng số nhỏ nhất (bit ngoài cùng bên phải) được điền bằng 0. Bạn có thể nói gì về hoạt động này?
-
Bằng cách dịch chuyển từng bit của một số
X
sangN
trái, chúng ta nhân số đóX
với 2 N.Đây là một ví dụ:
-
Nhưng! Dấu của số có thể thay đổi nếu bit có giá trị 1 chiếm vị trí ngoài cùng bên trái.
-
Nếu bạn dịch sang trái vô thời hạn, số đó sẽ chuyển thành 0. Hãy chứng minh điểm 2 và 3:
Dịch chuyển bit sang phải
Toán tử này áp dụng cho hai toán hạng. Những thứ kia. trong thao tácx >> y
, các bit của số x
sẽ dịch chuyển y
vị trí sang phải. Hãy xem một ví dụ khác. Hãy để chúng tôi phân tích sơ đồ hoạt động 10 >> 1
. Hãy dịch chuyển tất cả các bit của số 10 sang phải một vị trí: Trong quá trình dịch chuyển, chúng ta sẽ mất các bit bên phải. Họ chỉ đơn giản là biến mất. Bit ngoài cùng bên trái là dấu của số (0 là dương, 1 là âm). Do đó, ở giá trị cuối cùng, nó được đặt giống như ở số ban đầu. Ví dụ với số âm: Bit ngoài cùng bên phải bị mất và bit ngoài cùng bên trái được sao chép từ số gốc, như một dấu hiệu danh dự của số. Làm thế nào để thực hiện tất cả điều này trong IDEA? Về nguyên tắc thì không có gì phức tạp, chỉ cần lấy và di chuyển:
X
sang N
phải theo bit, chúng ta chia số đó X
cho 2 thành lũy thừa của 2 N
. Trình diễn:
public class BitOperationsDemo {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
int shiftOperationResult = 2048 >> i;
int devideOperationResult = 2048 / (int) Math.pow(2, i);
System.out.println(shiftOperationResult + " - " + devideOperationResult);
}
}
}
Những gì đang xảy ra ở đây?
-
Một vòng lặp trong đó biến i được tăng từ 1 lên 10.
- Mỗi lần lặp chúng ta tính 2 giá trị:
-
Chúng ta viết vào biến
shiftOperationResult
kết quả của việc dịch số 2048 theo i bit sang phải; -
devideOperationResult
Ta viết kết quả chia số 2048 cho 2 lũy thừa i thành một biến . -
Chúng tôi hiển thị hai giá trị thu được theo cặp.
GO TO FULL VERSION