JavaRush /Blog Java /Random-VI /Toán tử logic trong Java

Toán tử logic trong Java

Xuất bản trong nhóm
Các phép toán logic trong Java.  Các thao tác bitwise trong Java - 1

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 аblà 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 booleanhoặc Boolean, ví dụ:
  • (2 < 1)— toán hạng logic, giá trị của nó là sai
  • true- một toán hạng logic có giá trị rõ ràng là đúng
  • boolean a- cũng có thể là toán hạng logic, như Boolean a
  • int 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".
Các phép toán logic sau đây có sẵn trong Java:
  • Phủ định logic , còn được gọi NOTlà đả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à ANDmộ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à - &&.
Lưu ý: cũng trong logic toán học, họ xem xét mối quan hệ tương đương, nói cách khác là đẳng thức. Tuy nhiên, trong Java, toán tử đẳng thức==không được coi là toán tử logic. Chú ý! Trong Java, các toán tử logic&|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 !xcó 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 &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.

Các thao tác logic trong khóa học JavaRush

Không có lối thoát khỏi các phép toán logic và trong khóa học JavaRush, chúng xuất hiện từ cấp độ đầu tiên, cùng với các điều kiện và kiểu dữ liệu boolean. Các lập trình viên dần dần học cách sử dụng các phương pháp logic toán học. Để thao tác tự tin hơn với các cấu trúc logic, cần có sự khéo léo và hiểu biết nhất định về các quy trình nhất định. Vì vậy, các thao tác này được tiếp cận chi tiết hơn và ở một cấp độ hoàn toàn khác khi kết thúc nhiệm vụ Đa luồng, khi hầu hết học sinh không còn bị phân tâm trực tiếp bởi cú pháp và cấu trúc mà cố gắng đi sâu vào bản chất của nhiệm vụ.

Các phép toán logic trong Java.  Hoạt động bitwise trong Java - 2

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
Ví dụ. Hoạt động phủ định logic
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ạng aor bsai thì biểu thức a & bsẽ 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
Logic AND, nó cũng là một từ kết hợp, ví dụ:
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 & btoán hạng trong biểu thức ( ) asai 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
Logic OR, còn được gọi là phép phân biệt, ví dụ:
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ị XORhay 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
Ví dụ:
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:
  1. !
  2. &
  3. ^
  4. |
  5. &&
  6. ||
Hãy xem xét các ví dụ. Liên từ và phân ly ( &|) 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, с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 qcủ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 qsố 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: |^Các phép toán logic trong Java.  Các thao tác bitwise trong Java - 3

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.

Ngoài &, |^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
Đối với người mới bắt đầu, các toán tử bitwise có vẻ rất khó hiểu và giả tạo. Họ thường không hiểu họ cần để làm gì, ngoại trừ việc giải quyết các vấn đề giáo dục. Trên thực tế, chúng có thể được sử dụng ở mức tối thiểu để tổ chức phép chia và nhân hiệu quả và các chuyên gia sử dụng chúng để mã hóa/giải mã, mã hóa và tạo số ngẫu nhiên.

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.: Các phép toán logic trong Java.  Hoạt động bitwise trong Java - 4Logic tương tự có thể được tìm thấy trong trường hợp |^. Các phép toán logic trong Java.  Hoạt động bitwise trong Java - 5

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 << 1dị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 intphâ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. Các phép toán logic trong Java.  Hoạt động bitwise trong Java - 6Bit 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 << 2Nó dịch chuyển tất cả các bit biểu diễn nhị phân của số asang 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 << 3Kết quả sẽ là 104... Bạn có để ý mẫu không? Dịch chuyển bit asang trái theo n vị trí hoạt động giống như nhân một số avớ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 << 3sẽ cho kết quả -104. a >> ndị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 >> 2kế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ượng int 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 intchiế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:
  1. 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
  2. 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 đó)

  3. Thêm 1 vào số kết quả
    .

    
    11111111 11111111 11111111 11110011
Số nhị phân thu được là -13, được viết bằng mã bù hai và sự dịch chuyển bit (và các phép toán khác) sẽ được áp dụng riêng cho số đó. Chỉ là sự khác biệt về logic vận hành là không đáng kể trong mọi thao tác. Giả sử, với cùng một sự dịch chuyển sang trái, sự khác biệt là không đáng kể; chúng ta có thể làm việc với các số âm theo cách tương tự như với các số dương. Bây giờ chúng ta hãy chuyển sang phải -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ố asang 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ố -13bù 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 ~13sẽ đơ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ử &|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 ( >>>).
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION