JavaRush /Blog Java /Random-VI /Giới thiệu về các toán tử Java: Logic, Số học, Bitwise

Giới thiệu về các toán tử Java: Logic, Số học, Bitwise

Xuất bản trong nhóm
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. Giới thiệu các toán tử Java: Logic, Arithmetic, Bitwise - 1

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.
Một ví dụ về toán tử sẽ là một điểm cộng đơn giản trong phép tính cộng hai số. Và các số được cộng với nhau sẽ là toán hạng trong trường hợp này. Vì vậy, với sự trợ giúp của các toán tử, chúng ta thực hiện các phép toán trên một hoặc nhiều toán hạng. Các toán tử thực hiện các phép toán trên hai toán hạng được gọi là nhị phân. Ví dụ: cộng hai số. Các toán tử thực hiện các phép toán trên một toán hạng đơn được gọi là một ngôi. Ví dụ, một điểm trừ đơn nhất.

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:
Bảng 1. Các toán tử số học nhị phân
Giới thiệu các toán tử Java: Logic, Arithmetic, Bitwise - 2Bố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ề:
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: Giới thiệu các toán tử Java: Logic, Arithmetic, Bitwise - 3Chươ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 xvà 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ị xbằng tổng giá trị hiện tại của biến xvà 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:
Giới thiệu về các toán tử Java: Logic, Arithmetic, Bitwise - 4
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:
Giới thiệu về các toán tử Java: Logic, Arithmetic, Bitwise - 4Ví dụ về cộng và trừ đơn nguyên:
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);
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 6
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:
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 đó:
Bảng 3. Toán tử tăng giảm:
Giới thiệu về các toán tử Java: Logic, Arithmetic, Bitwise - 5Trình diễn:
Giới thiệu các toán tử Java: Logic, Arithmetic, Bitwise - 8
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
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 9Ví dụ:
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:
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 10

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 là một toán tử và áp dụng cho một toán hạng duy nhất. Tất cả các hoạt động khác là nhị phân. Hãy xem xét bảng chân trị của các phép toán này. Ở đây 0 tương đương với false trong Java và 1 tương đương với true .
Bảng 5. Bảng chân lý của toán tử phủ định (NOT)
Giới thiệu các toán tử Java: Logic, Arithmetic, Bitwise - 7
Bảng 6. Bảng chân trị của toán tử kết hợp (AND)
Giới thiệu các toán tử Java: Logic, Arithmetic, Bitwise - 8
Bảng 7. Bảng chân trị của toán tử tách (OR)
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 9
Bảng 8. Bảng chân trị của toán tử cộng modulo (XOR)
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 10Java có các hoạt động logic tương tự:
  • !- 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.
Chúng ta hãy xem xét sự khác biệt giữa các toán tử bitwise và tốc ký sâu hơn một chút bên dưới, đồng thời chuyển đổi tất cả các bảng chân lý thành mã Java:
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 booleancá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 booleancác biến:
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 15
Và với booleancác biểu thức:
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 16
Bây giờ, chúng ta có các toán tử tốc ký ( &&, ||) 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 xcó 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.
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 17
Đô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 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ỏ:
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 18
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.

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.
Hãy chứng minh cách đếm từ 0 đến 15 ở dạng thập phân và nhị phân:
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 11Như 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ì:

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 bytebộ 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ố bytecó thể mang 256 giá trị khác nhau (128 âm, 127 dương và 1 số 0). Mỗi giá trị số bytecó một bộ tám bit duy nhất. Đây là trường hợp không chỉ với loại bytemà 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ữ: Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 12Hã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:
Giới thiệu về các toán tử Java: Logic, Số học, Bitwise - 21
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õ. intsố 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.
Hãy xem xét điều này bằng cách sử dụng số 8 bit làm ví dụ:
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 13Cá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.

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: Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 14Như 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ấy NOT, 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: Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 15Chú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:
Giới thiệu về các toán tử Java: Logic, Số học, Bitwise - 25
Ở 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.
Giới thiệu về các toán tử Java: Logic, Arithmetic, Bitwise - 26

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ác ANDgiữa các bit của mỗi số. Hãy xem một ví dụ: Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 16Thao tác này được thực hiện trên hai số. Ví dụ trong mã Java:
Giới thiệu về các toán tử Java: Logic, Arithmetic, Bitwise - 28

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ố: Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 17Bây giờ chúng ta hãy xem nó trông như thế nào trong IDEA:
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 30

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: Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 18Mã ví dụ:
Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 32

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án x << y, các bit của số xsẽ dịch chuyển yvị trí sang trái. Nó có nghĩa là gì? Hãy xem ví dụ về phép tính, 10 << 1 Giới thiệu các toán tử Java: Logic, Số học, Bitwise - 19kế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?
  1. Bằng cách dịch chuyển từng bit của một số Xsang Ntrái, chúng ta nhân số đó Xvới 2 N.

    Đây là một ví dụ:

    Giới thiệu về các toán tử Java: Logic, Số học, Bitwise - 34
  2. 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.

  3. 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:

    Giới thiệu về các toán tử Java: Logic, Số học, Bitwise - 35

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ác x >> y, các bit của số xsẽ dịch chuyển yvị 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í: Giới thiệu về các toán tử Java: Logic, Số học, Bitwise - 20Trong 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: Giới thiệu về các toán tử Java: Logic, Số học, Bitwise - 21Bit 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:
Знакомство с операторами Java: логические, арифметические, побитовые - 38
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ố Xsang Nphải theo bit, chúng ta chia số đó Xcho 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?
  1. Một vòng lặp trong đó biến i được tăng từ 1 lên 10.

  2. Mỗi lần lặp chúng ta tính 2 giá trị:
    • Chúng ta viết vào biến shiftOperationResultkết quả của việc dịch số 2048 theo i bit sang phải;

    • devideOperationResultTa viết kết quả chia số 2048 cho 2 lũy thừa i thành một biến .

  3. Chúng tôi hiển thị hai giá trị thu được theo cặp.

Kết quả thực hiện chương trình như sau: 1024 - 1024 512 - 512 256 - 256 128 - 128 64 - 64 32 - 32 16 - 16 8 - 8 4 - 4 2 - 2

Dịch chuyển sang phải theo bit với phần đệm bằng 0

Trong khi dịch chuyển phải thông thường giữ nguyên dấu của số (bit quan trọng nhất giữ nguyên giá trị của nó), dịch chuyển phải điền vào 0 thì không. Và bit quan trọng nhất được điền bằng 0. Hãy xem nó trông như thế nào: Знакомство с операторами Java: логические, арифметические, побитовые - 22

Mức độ ưu tiên của các hoạt động trong Java

Giống như toán học, Java có quyền ưu tiên của các phép toán. Bảng bên dưới hiển thị mức độ ưu tiên (từ cao nhất đến thấp nhất) của các hoạt động mà chúng tôi đã xem xét. Знакомство с операторами Java: логические, арифметические, побитовые - 23

Ví dụ hữu ích về việc sử dụng

Xác định tính chẵn lẻ của một số

Знакомство с операторами Java: логические, арифметические, побитовые - 24

Tìm phần tử lớn nhất trong mảng

Знакомство с операторами Java: логические, арифметические, побитовые - 25Để tìm phần tử nhỏ nhất, chỉ cần đổi dấu so sánh vào đúng chỗ.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION