- Toán tử logic trong Java
- Toán tử phủ định logic!
- Logic AND - &, cũng như AND có điều kiện - &&
- OR logic là toán tử |, cũng như OR có điều kiện là toán tử ||
- XOR - toán tử OR - độc quyền logic ^
- Mức độ ưu tiên của các hoạt động logic
- Biểu thức logic phức tạp
- Toán tử bitwise (bitwise)
- Toán tử bitwise &, | và ^
- Mã bổ sung
- Toán tử phủ định theo bit ~
Các hoạt động logic trong Java
Các phép toán logic được thực hiện bằng cách sử dụng toán tử Boolean. Xin lỗi vì sự trùng lặp, nhưng mọi chuyện chính xác là như thế này. Các phép toán logic cơ bản (trong lập trình và toán học) có thể được áp dụng cho các đối số logic (toán hạng) và cũng có thể được sử dụng để tạo thành các biểu thức phức tạp hơn, tương tự như các phép toán số học trên các con số. Ví dụ biểu thức:
(a | b) | (c < 100) & !(true) ^ (q == 5)
là một biểu thức logic phức tạp với bốn toán hạng: (a | b)
, ở đâu а
và b
là các biến kiểu boolean
(c < 100)
(true)
(q == 5)
.. Ngược lại, một biểu thức logic đơn giản (a | b)
cũng bao gồm hai đối số toán hạng. Toán hạng logic là một biểu thức có thể được cho là đúng hoặc sai, đúng hoặc sai . Theo cách nói của Java, toán hạng Boolean là một biểu thức của kiểu boolean
hoặc Boolean, ví dụ:
(2 < 1)
— toán hạng logic, giá trị của nó là saitrue
- một toán hạng logic có giá trị rõ ràng là đúngboolean a
- cũng có thể là toán hạng logic, như Boolean aint a = 2
- không phải là toán hạng logic , nó chỉ là một biến có kiểuint
String a = "true"
cũng không phải là toán hạng logic . Đây là một chuỗi có giá trị văn bản là"true"
.
- Phủ định logic , còn được gọi
NOT
là đảo ngược. Trong Java, nó được biểu thị bằng!
ký hiệu “ ” trước toán hạng. Áp dụng cho một toán hạng. - Logic và , nó cũng là
AND
một sự kết hợp. Được biểu thị bằng&
ký hiệu “ ” giữa hai toán hạng mà nó được áp dụng. - Logic hay trong Java thì nó cũng là -
OR
, nó cũng là sự phân ly. Trong Java, nó được biểu thị bằng ký hiệu “|
” giữa hai toán hạng. - Độc quyền hoặc ,
XOR
, sự phân chia chặt chẽ. Trong Java, nó được biểu thị bằng ký hiệu “^
” giữa hai toán hạng. - Trong Java, các toán tử logic bao gồm các toán tử có điều kiện or , được ký hiệu là
||
, cũng như các toán tử có điều kiện và -&&
.
==
không được coi là toán tử logic. Chú ý! Trong Java, các toán tử logic&
và|
cũng^
áp dụng cho số nguyên. Trong trường hợp này, chúng hoạt động hơi khác một chút và được gọi là toán tử logic bitwise (hoặc bitwise). Về họ - ở cuối bài viết. Chúng ta hãy xem một bảng có mô tả ngắn gọn về từng toán tử logic Java và bên dưới chúng tôi sẽ mô tả chúng chi tiết hơn và cung cấp các ví dụ về mã.
Toán tử Java | Tên | Kiểu | Mô tả ngắn | Ví dụ |
---|---|---|---|---|
! |
Logic “không” (phủ định) | đơn nhất | !x có nghĩa là “không phải x”. Trả về true nếu toán hạng sai . Trả về false nếu toán hạng đúng . |
boolean x = true; Sau đó // !x == false |
& |
Logic VÀ ( AND , phép nhân) |
nhị phân | Trả về true nếu cả hai toán hạng đều đúng . | a = true; b = false; Sau đó a & b == false |
| |
Logic HOẶC ( OR , phép cộng) |
nhị phân | Trả về true nếu ít nhất một trong các toán hạng là đúng . | a = true; b = false; Sau đó a | b == true |
^ |
Loại trừ logic HOẶC ( XOR ) |
nhị phân | Trả về true nếu một và chỉ một trong các toán hạng là đúng . Trả về false nếu cả hai toán hạng đều đúng hoặc sai . Về cơ bản, nó trả về true nếu các toán hạng khác nhau. | a = true; b = false; Sau đó a ^ b == true |
&& |
AND có điều kiện ( AND logic ngắn) | nhị phân | Tương tự như , & nhưng nếu toán hạng bên trái & là false thì toán tử này trả về false mà không kiểm tra toán hạng thứ hai. |
|
|| |
OR có điều kiện (OR logic ngắn) | nhị phân | Tương tự như , | nhưng nếu toán tử bên trái là true thì toán tử trả về true mà không cần kiểm tra toán hạng thứ hai. |
Toán tử phủ định logic!
Toán tử này là một ngôi, nghĩa là nó áp dụng cho một biểu thức hoặc toán hạng Boolean. Nó rất đơn giản để hiểu, giống như bất kỳ sự phủ định nào: toán tử chỉ cần thay đổi ý nghĩa của biểu thức thành ý nghĩa ngược lại của nó. Bảng chân trị hoặc kết quả thực hiện phép toán phủ định:Giá trị của một | !Một |
SAI | ĐÚNG VẬY |
ĐÚNG VẬY | SAI |
public class Solution {
public static void main(String[] args) {
boolean a = true;
System.out.println(!a); // here our boolean expression reverses its value
System.out.println(!false); // non-false expression, as you might guess, will be equal to... what?
System.out.println(!(2 < 5)); // expression (2 < 5) is true, so its negation is false
}
}
Đầu ra của chương trình sẽ như sau:
false
true
false
Logic AND - &, cũng như AND có điều kiện - &&
Logic AND hoặc kết hợp được áp dụng cho hai biểu thức và kết quả của nó sẽ chỉ đúng nếu cả hai toán hạng đều đúng. Nghĩa là, nếu một trong các toán hạnga
or b
là sai thì biểu thức a & b
sẽ sai bất kể giá trị của toán tử thứ hai. Nếu bạn tưởng tượng rằng true là số 1 và false là 0 thì toán tử &
hoạt động giống hệt như phép nhân thông thường. Do đó, logic AND thường được gọi là phép nhân logic. Và nhân tiện, thực tế này giúp ghi nhớ nhanh chóng hoạt động của toán tử &
và không nhầm lẫn nó với logic hoặc toán tử |
. Bảng chân trị AND, nó cũng là kết quả lao động của người vận hành&
Một | b | a&b |
ĐÚNG VẬY | ĐÚNG VẬY | ĐÚNG VẬY |
ĐÚNG VẬY | SAI | SAI |
SAI | ĐÚNG VẬY | SAI |
SAI | SAI | SAI |
public class Solution {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean c = true;
System.out.println(a & b); // if we multiply true by false, we will definitely get false
System.out.println(a & c); // true to true will be true
System.out.println(false & (2 > 5));
System.out.println((2 < 5) & false);
// regardless of the truthfulness of the expression in brackets, in which case we have to be content with false
}
}
Kết quả của chương trình:
false
true
false
false
Toán tử &&
đôi khi được gọi là “AND ngắn”. Nó tạo ra kết quả tương tự khi làm việc với các toán hạng logic như toán tử &
. Tuy nhiên, có một sự khác biệt trong chính công việc của anh ấy. Vì vậy, bạn đã nhận thấy rằng nếu a & b
toán hạng trong biểu thức ( ) a
là sai thì việc kiểm tra giá trị của toán hạng là vô nghĩa b
: kết quả của phép toán chắc chắn sẽ là sai . Vì vậy, nếu về cơ bản chúng ta không cần giá trị của toán hạng thứ hai, thì việc sử dụng nó &&
sẽ giảm số lượng phép tính trong chương trình. Nếu chúng ta thay thế tất cả các toán tử trong ví dụ &
bằng &&
, kết quả sẽ hoàn toàn giống nhau, nhưng bản thân chương trình sẽ chạy nhanh hơn một chút (mặc dù chúng ta sẽ không nhận thấy điều này, vì chúng ta đang nói về mili-micro... tóm lại là , đơn vị thời gian rất nhỏ).
OR logic là toán tử |, cũng như OR có điều kiện là toán tử ||
Toán tử OR trong Java được biểu thị bằng ký hiệu|
. Một OR hoặc phép phân biệt logic được áp dụng cho hai biểu thức và kết quả của nó sẽ sai khi và chỉ khi cả hai toán hạng đều sai. Ở đây, ở một mức độ nào đó, chúng ta quan sát thấy bức tranh tương tự như trong trường hợp của người vận hành &
, nhưng hoàn toàn ngược lại. Nghĩa là, nếu ít nhất một toán hạng là true thì biểu thức a | b
được đảm bảo là đúng bất kể giá trị của toán tử thứ hai. Nếu &
nó hoạt động giống như phép nhân logic thì OR là phép cộng logic, nếu bạn tưởng tượng rằng true là 1 và false là 0. Chỉ cần nhớ rằng phép cộng logic hoạt động khác với phép cộng thông thường. 1 + 1 trong trường hợp này không phải bằng 2 mà bằng 1 (đơn giản là số 2 không tồn tại trong hệ thống này). Đôi khi phép phân biệt được hiểu là giá trị lớn nhất của 0 và 1, và trong trường hợp này, nếu ít nhất một toán hạng bằng 1 ( true ), chúng ta sẽ nhận được chính xác true . OR bảng chân trị hay còn gọi là kết quả của toán tử |
:
Một | b | một | b |
ĐÚNG VẬY | ĐÚNG VẬY | ĐÚNG VẬY |
ĐÚNG VẬY | SAI | ĐÚNG VẬY |
SAI | ĐÚNG VẬY | ĐÚNG VẬY |
SAI | SAI | SAI |
public class Solution {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean c = true;
System.out.println(!a | b); // Compose the use of two logical operators: a == true, so !a, as we already know, is false.
System.out.println(a | c);
System.out.println((2 < 5) | false); // expression (2 < 5) is true, which means that for any second operand we get a true result
System.out.println((2 > 5) | true);
}
}
Kết quả:
false
true
true
true
Nếu chúng ta sử dụng toán tử OR có điều kiện - ||
thay vì |
, chúng ta sẽ nhận được kết quả giống hệt nhau, nhưng, như trong trường hợp có điều kiện AND &&
, nó sẽ hoạt động tiết kiệm: nếu chúng ta “gặp phải” toán hạng đầu tiên bằng true , giá trị của toán hạng thứ hai không được kiểm tra nhưng ngay lập tức kết quả là true .
XOR Java - toán tử OR - độc quyền về mặt logic ^
XOR
, cộng modulo 2, XOR logic, trừ logic, tách chặt, bù bit... toán tử ^
có nhiều tên trong đại số Boolean. Kết quả của việc áp dụng toán tử này cho hai toán hạng sẽ đúng nếu các toán hạng khác nhau và sai nếu các toán hạng giống nhau. Do đó, sẽ rất thuận tiện khi so sánh nó với việc trừ các số 0 ( false ) và số 1 ( true ). Bảng chân trị XOR
hay còn gọi là kết quả của toán tử ^
:
Boolean một | Boolean b | a^b |
ĐÚNG VẬY | ĐÚNG VẬY | SAI |
ĐÚNG VẬY | SAI | ĐÚNG VẬY |
SAI | ĐÚNG VẬY | ĐÚNG VẬY |
SAI | SAI | SAI |
public class Solution {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean c = true;
System.out.println(!a ^ b); // Compose the use of two logical operators: a == true, so !a, as we already know, is false.
System.out.println(a ^ c);
System.out.println((2 < 5) ^ false);
System.out.println((2 > 5) ^ true);
}
}
Kết quả:
false
false
true
true
Mức độ ưu tiên của các hoạt động logic
Cũng giống như trong toán học, trong lập trình, các toán tử có thứ tự thực hiện cụ thể khi chúng xuất hiện trong cùng một biểu thức. Các toán tử một ngôi có lợi thế hơn các toán tử nhị phân và phép nhân (thậm chí logic) so với phép cộng. Chúng tôi đã xếp hạng các toán tử logic cao hơn trong danh sách, mức độ ưu tiên của chúng càng cao:!
&
^
|
&&
||
&
và |
) có độ ưu tiên khác nhau:
public class Solution {
public static void main(String[] args) {
boolean a = true, b = true, c = false;
System.out.println(a | b & c);
}
Nếu chúng ta tiến hành từ trái sang phải, nghĩa là trước tiên áp dụng toán tử |
và sau đó - &
, chúng ta sẽ nhận được giá trị false . Nhưng trên thực tế, nếu bạn chạy chương trình này, bạn sẽ chắc chắn rằng kết quả đầu ra sẽ đúng , vì toán tử logic AND &
sẽ có mức độ ưu tiên cao hơn toán tử logic OR |
. Để tránh nhầm lẫn, bạn cần nhớ rằng cái gì &
hoạt động như phép nhân và |
cái gì hoạt động giống phép cộng. Bạn có thể thay đổi thứ tự ưu tiên. Chỉ cần sử dụng dấu ngoặc đơn, giống như trong môn toán ở trường. Hãy thay đổi mã ví dụ của chúng tôi một chút:
public class Solution {
public static void main(String[] args) {
boolean a = true, b = true, c = false;
System.out.println((a|b)&c);
}
Có chuyện gì vậy? Đầu tiên chúng ta sử dụng phép cộng logic trong ngoặc và sau đó là phép nhân. Kết quả sẽ là sai .
Biểu thức logic phức tạp
Tất nhiên, chúng ta có thể kết hợp các biểu thức và toán tử Boolean. Chúng ta hãy nhớ lại câu nói ở đầu bài viết:(a | b) | (c < 100) & !(true) ^ (q == 5)
Bây giờ trông nó không còn đáng sợ nữa. Hãy viết một chương trình hiển thị giá trị của nó, trước đó đã xác định các giá trị của a
, b
, с
và q
. Ví dụ về tính giá trị của biểu thức Boolean phức tạp
public class Solution {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
int c = 25;
int q = 2;
System.out.println((a|b) | (c < 100) & !(true)^(q == 5));
}
}
Ghi chú:Biến q
của chúng tôi thuộc loại int
, nhưng q == 5
đây là biểu thức Boolean và nó bằng false , vì ở trên chúng tôi đã khởi tạo bằng q
số 2. Điều tương tự cũng xảy ra với biến c
. Số này bằng 25, nhưng (c < 100) là biểu thức Boolean bằng true . Kết quả của chương trình này:
true
Các biểu thức Boolean phức tạp có thể được sử dụng để kiểm tra các điều kiện rất phức tạp và phân nhánh, nhưng không nên lạm dụng chúng: chúng làm cho mã khó đọc.
Toán tử bitwise (bitwise)
Ở đầu bài viết, chúng tôi đã đề cập rằng các toán tử&
và có thể được sử dụng liên quan đến các kiểu số nguyên Java. Trong trường hợp này chúng là các toán tử bitwise. Chúng còn được gọi là theo bit, vì một chữ số là một bit và các thao tác này hoạt động cụ thể với các bit. Tất nhiên, chúng hoạt động hơi khác so với các toán tử logic và để hiểu chính xác cách thức hoạt động, bạn cần biết hệ thống số nhị phân là gì. Nếu bạn không biết gì về nó hoặc đã quên hoàn toàn, chúng tôi khuyên bạn trước tiên nên đọc bài viết Java: bit và byte và nhắc nhở những người khác rằng trong hệ thống số nhị phân chỉ có hai chữ số - 0 và 1, và tất cả dữ liệu trong máy tính được biểu diễn chính xác bằng cách sử dụng các số 0 và số 1 có điều kiện. Bất kỳ số nào chúng ta quen thuộc (số thập phân; đối với chúng có 10 chữ số khác nhau từ 0 đến 9, chúng ta viết bất kỳ số nào) đều có thể được biểu diễn trong hệ thống số nhị phân. Bạn có thể chuyển đổi số thập phân sang nhị phân bằng cách chia tuần tự thành một cột bằng hệ cơ số (2). Phần dư của phép chia ở mỗi bước viết theo thứ tự ngược lại sẽ cho ta số nhị phân mong muốn. Ví dụ, đây là sự chuyển đổi số thập phân 103 thành biểu diễn nhị phân: |
^
Hệ thống số nhị phân trong khóa học JavaRush Trong khóa học JavaRush, họ nói về hệ thống số nhị phân trong khi nghiên cứu nhiệm vụ MultiThreading (cấp 10, bài giảng 1); sau bài giảng có một số nhiệm vụ củng cố. Tuy nhiên, chủ đề này không hề khó và ngay cả khi bạn chưa tiến xa đến mức đó trong khóa học, bạn vẫn có thể hiểu được. |
&
, |
và ^
Java còn sử dụng các toán tử bitwise:
~
toán tử phủ định bitwise>>
dịch chuyển bit sang phải>>>
dịch chuyển phải theo chiều bit không dấu<<
dịch chuyển bit sang trái
Toán tử bitwise &, | và ^
Hãy xem một ví dụ về cách các toán tử này hoạt động. Giả sử chúng ta có hai số nguyên:int a = 25;
int b = 112;
Chúng ta cần áp dụng ba thao tác cho chúng và &
hiển thị kết quả trên màn hình. Đây là mã chương trình: |
^
public class Solution {
public static void main(String[] args) {
int a = 25;
int b = 112;
int res1 = a & b;
int res2 = a | b;
int res3 = a ^ b;
System.out.println("a & b = " + res1);
System.out.println("a | b = " + res2);
System.out.println("a ^ b = " + res3);
}
}
Kết quả của chương trình như sau:
a & b = 16
a | b = 121
a ^ b = 105
Nếu bạn không hiểu điều gì đang xảy ra thì kết quả sẽ trông rất rất bí ẩn. Trên thực tế, mọi thứ đơn giản hơn bạn tưởng. Các toán tử bitwise “xem” các số toán hạng ở dạng nhị phân của chúng. Và sau đó họ áp dụng các toán tử logic &
hoặc cho các chữ số (bit) tương ứng của cả hai số |
. ^
Vì vậy, đối với &
bit cuối cùng của biểu diễn nhị phân của số 25 sẽ cộng một cách logic với bit cuối cùng của biểu diễn nhị phân của số 112, bit áp chót với bit áp chót, v.v.: Logic tương tự có thể được tìm thấy trong trường hợp |
và ^
.
Dịch chuyển bit sang trái hoặc phải
Có một số toán tử dịch chuyển bit trong Java. Các toán tử được sử dụng phổ biến nhất<<
là và >>
. Họ dịch chuyển biểu diễn nhị phân của một số sang trái hoặc phải tương ứng và trong trường hợp dịch chuyển sang phải, trong khi vẫn giữ nguyên dấu (chúng tôi sẽ giải thích ý nghĩa của việc giữ nguyên dấu bên dưới). Có một toán tử dịch chuyển phải khác >>>
. Nó thực hiện tương tự nhưng >>
không lưu dấu. Vì vậy, hãy xem công việc của họ bằng một ví dụ. int a = 13
a << 1
dịch chuyển tất cả các bit biểu diễn nhị phân của số a sang trái 1 bit. Để đơn giản hóa, hãy tưởng tượng số 13 ở dạng nhị phân là 0000 1101. Trên thực tế, số này trông như thế này: 00000000 00000000 00000000 00001101, vì Java int
phân bổ 4 byte hoặc 32 bit cho các số. Tuy nhiên, điều này không đóng vai trò gì trong ví dụ, vì vậy trong ví dụ này, chúng tôi sẽ coi số của chúng tôi là một byte. Bit trống bên phải chứa đầy số không. Kết quả của thao tác này, chúng ta nhận được số 26. a << 2
Nó dịch chuyển tất cả các bit biểu diễn nhị phân của số a
sang trái 2 bit và hai bit trống ở bên phải được điền bằng số không. Kết quả là chúng ta sẽ nhận được số 52. a << 3
Kết quả sẽ là 104... Bạn có để ý mẫu không? Dịch chuyển bit a
sang trái theo n vị trí hoạt động giống như nhân một số a
với 2 lũy thừa của n. Điều tương tự cũng áp dụng cho số âm. Điều này -13 << 3
sẽ cho kết quả -104. a >> n
dịch chuyển biểu diễn nhị phân của một số n vị trí sang phải. Ví dụ: 13 >> 1
Chuyển số 1101 thành số 0110, tức là 6. Và 13 >> 2
kết quả sẽ là 3. Về bản chất, ở đây chúng ta chia số đó cho 2 lũy thừa của n, trong đó n là số ca ở bên phải, nhưng có một lưu ý: nếu số đó là số lẻ, trong thao tác này, chúng ta dường như đặt lại bit cuối cùng của số. Nhưng với những người tiêu cực thì tình hình có phần khác. Giả sử, hãy thử kiểm tra xem chương trình sẽ tạo ra kết quả gì nếu bạn yêu cầu nó thực hiện một thao tác -13 >> 1
. Bạn sẽ thấy số -7 chứ không phải -6 như bạn nghĩ. Điều này xảy ra do cách lưu trữ số âm trong Java và các ngôn ngữ lập trình khác. Chúng được lưu trữ trong cái gọi là mã bổ sung. Trong trường hợp này, chữ số có nghĩa nhất (chữ số bên trái) được ghi dưới dấu. Trong trường hợp số âm, chữ số có ý nghĩa lớn nhất là 1.
Mã bổ sung
Hãy xem xét số lượngint a = 13
. Nếu trong chương trình, bạn in biểu diễn nhị phân của nó ra bàn điều khiển bằng lệnh System.out.println(Integer.toBinaryString(a));
, thì chúng ta sẽ nhận được 1101. Trên thực tế, đây là ký hiệu viết tắt, vì số loại int
chiếm 4 byte trong bộ nhớ nên máy tính “nhìn thấy” nó nhiều hơn như thế này:
00000000 00000000 00000000 00001101
Chữ số có nghĩa nhất là 0, nghĩa là chúng ta có số dương. Để chuyển đổi sang mã bổ sung:
-
Chúng tôi viết số -13 trong cái gọi là "mã trực tiếp". Để thực hiện việc này, hãy thay đổi chữ số có nghĩa nhất của số thành 1.
Kết quả của hành động:10000000 0000000 0000000 00001101
-
Tiếp theo, chúng ta đảo ngược tất cả các bit (chúng ta thay đổi 0 thành 1 và 1 thành 0) ngoại trừ bit dấu. Trên thực tế, chúng tôi đã thay đổi nó rồi.
Kết quả của hành động:11111111 11111111 11111111 11110010
(vâng, bước 1 và 2 có thể được kết hợp, nhưng tốt hơn hết bạn nên nghĩ theo cách đó)
- Thêm 1 vào số kết quả
.11111111 11111111 11111111 11110011
-13 >> 1
. Vì toán tử của chúng tôi >>
giữ nguyên dấu, nên trong thao tác này, tất cả các bit được giải phóng ở bên trái không được điền bằng số 0 mà bằng số 1. Vì vậy, chuyển số
11111111 11111111 11111111 11110011
sang phải một bit, dẫn đến chuỗi bit sau:
11111111 11111111 11111111 11111001
Nếu chúng ta chuyển đổi số này thành mã trực tiếp (nghĩa là đầu tiên trừ 1, sau đó đảo ngược tất cả các bit ngoại trừ số đầu tiên), chúng ta sẽ nhận được số:
10000000 00000000 00000000 00000111
hoặc -7. Bây giờ chúng ta đã hiểu toán tử dịch chuyển phải bảo toàn dấu, chúng ta sẽ thấy rõ nó khác với toán tử >>>
. a >>> n
— thao tác này là một phép dịch không dấu, nghĩa là nó dịch biểu diễn nhị phân của một số a
sang phải n bit, nhưng lấp đầy n bit còn trống ở bên trái không phải bằng các bit như toán tử >>
mà bằng các số 0. Hãy thực hiện thao tác -13 >>> 1
. Chúng ta đã có số -13
bù hai:
11111111 11111111 11111111 11110011
Bằng cách dịch sang phải 1 bit và điền vào bit trống bằng 0, chúng ta nhận được số sau:
01111111 11111111 11111111 11111001
Điều gì mang lại số trong ký hiệu thập phân 2147483641
.
Toán tử phủ định theo bit ~
Toán tử một ngôi này hoạt động rất đơn giản: nó đảo ngược từng bit biểu diễn nhị phân của một số nguyên. Hãy lấy số-13
:
11111111 11111111 11111111 11110011
Hoạt động phủ định theo bit ~13
sẽ đơn giản đảo ngược giá trị của từng bit. Kết quả là chúng tôi nhận được:
00000000 00000000 00000000 00001100
Hoặc 12
ở dạng thập phân.
Kết luận ngắn gọn
- Tất cả các toán tử logic đều áp dụng cho các biểu thức Boolean, nghĩa là những biểu thức có thể được coi là đúng hoặc sai .
- Nếu các toán tử
&
hoặc được áp dụng cho các số, chúng ta không còn nói về các phép toán logic nữa mà là về các phép toán theo bit|
.^
Nghĩa là, cả hai số đều được chuyển đổi thành hệ nhị phân và các phép tính cộng, nhân hoặc trừ logic được áp dụng cho các số này từng chút một. - Trong logic toán học, các toán tử
&
và|
tương ứng với sự kết hợp và phân ly. - Logic AND tương tự như nhân 1 ( true ) và 0 ( false ).
- Logic OR tương tự như tìm giá trị lớn nhất trong số 1 ( true ) và 0 ( false ).
- Để phủ định theo bit của số nguyên a, toán tử được sử dụng
~a
. - Để phủ định một cách logic một biểu thức Boolean a, hãy sử dụng toán tử
!a
. - Các số âm được lưu trữ và xử lý bằng mã bù hai.
- Việc dịch chuyển bit sang phải có thể
>>
hoặc không giữ được dấu (>>>
).
GO TO FULL VERSION