Hiểu toán tử Bitwise trong JavaScript
Các toán tử bitwise là những toán tử hoạt động ở cấp độ nhị phân. Chúng thường thực thi rất nhanh và thường hoạt động trên hai toán hạng.
Bạn có thể sử dụng toán tử bitwise để thao tác với số nhị phân, tối ưu hóa mã, nén dữ liệu và triển khai các kỹ thuật đồ họa hoặc lập trình trò chơi. Giống như hầu hết các ngôn ngữ lập trình khác, JavaScript hỗ trợ tuyệt vời cho các thao tác bitwise.
Mục Lục
Toán tử là gì?
Hầu hết các ngôn ngữ lập trình đều sử dụng khái niệm “toán tử”—một biểu tượng yêu cầu trình thông dịch thực hiện một phép toán, quan hệ hoặc logic cụ thể.
Có nhiều loại toán tử JavaScript khác nhau mà bạn nên biết, từ những loại trông giống như toán tử toán học tiêu chuẩn, chẳng hạn như “+”, đến các toán tử so sánh hai giá trị. Các toán tử bitwise là một tập hợp đặc biệt xử lý các số nhị phân.
Toán tử Bitwise AND (&)
JavaScript bitwise VÀ (&) toán tử so sánh các bit tương ứng của hai toán hạng nhị phân—các số chỉ chứa 0 và 1. Đối với mỗi cặp bit đầu vào, bit đầu ra tương ứng là “1” nếu cả hai bit đầu vào là “1” hoặc “0” nếu ngược lại.
Đây là cú pháp của toán tử AND theo bit:
a & b
Trong ví dụ này, Một Và b là các toán hạng mà bạn đang thực hiện thao tác bitwise.
Đây là cách hoạt động của toán tử AND theo bit:
- Phép toán AND áp dụng cho từng cặp bit tương ứng trong Một Và b từ phải qua trái.
- Nếu cả hai bit là 1, kết quả là 1. Nếu một trong hai bit là 0, kết quả là 0.
- Kết quả là một số mới trong đó mỗi bit đại diện cho kết quả của phép toán AND trên các bit tương ứng của Một Và b.
Ví dụ:
let a = 50;
let b = 100; let result = a & b;
console.log(result);
Trong ví dụ trên, Một là 50 ở dạng thập phân, tương đương với số nhị phân 00110010 và b là 100 ở dạng thập phân, tương đương với số nhị phân 01100100. Toán tử AND so sánh từng cặp bit tương ứng từ phải sang trái và tạo ra số nhị phân kết quả 00100000, là 32 ở dạng thập phân.
Toán tử Bitwise OR (|)
Bitwise OR (|) so sánh các bit tương ứng của hai toán hạng và trả về “1” nếu một hoặc cả hai bit là “1” và “0” nếu cả hai bit là “0”.
Đây là cú pháp của toán tử OR theo bit:
a | b
Ở đâu Một Và b là các toán hạng của phép toán.
Toán tử OR (|) theo bit hoạt động giống như toán tử AND theo bit. Sự khác biệt duy nhất là toán tử OR trả về “1” nếu “một trong hai” của các bit là “1” và “0” nếu “cả hai” bit là “0”.
Ví dụ:
let a = 50;
let b = 100; let result = a | b;
console.log(result);
Trong ví dụ trên, toán tử OR theo bit so sánh từng cặp bit từ phải sang trái (tức là, 0 | 0 = 0, 0 | 1 = 1, 1 | 1 = 1, và như thế). Số nhị phân thu được là 01110110, là 118 ở dạng thập phân.
Toán tử Bitwise XOR (^)
XOR theo bit (^) so sánh các bit tương ứng của hai toán hạng và trả về “1” nếu một trong hai nhưng không phải cả hai toán hạng là “1” và “0” nếu cả hai toán hạng là “1” hoặc “0”.
Đây là cú pháp của toán tử XOR bitwise:
a ^ b
Ở đâu Một Và b là các toán hạng của phép toán.
Toán tử XOR theo bit hoạt động giống như toán tử OR và AND theo bit. Sự khác biệt duy nhất là nó trả về “1” nếu “một trong hai nhưng không phải cả hai” của toán hạng là “1” và “0” nếu “cả hai” của toán hạng là “1” hoặc “0”.
Ví dụ:
let a = 50;
let b = 100; let result = a ^ b;
console.log(result);
Trong ví dụ trên, toán tử XOR so sánh từng cặp bit từ phải sang trái (tức là, 0^0 = 0, 0^1 = 1, 1^1 = 0, và như thế). Số nhị phân thu được là 01010110, là 86 ở dạng thập phân.
Bitwise NOT (~) Toán tử
Bitwise KHÔNG (~) là toán tử một ngôi hoạt động trên một số nguyên duy nhất bằng cách đảo ngược tất cả các bit của nó. Nói cách khác, nó thay đổi mọi bit “0” thành “1” và mọi bit “1” thành “0”.
Đây là cú pháp của toán tử NOT bitwise:
~c
Ở đâu c là toán hạng.
Toán tử NOT theo bit hoạt động bằng cách đảo ngược tất cả các bit của một toán hạng, bao gồm cả các bit dấu.
Ví dụ:
let c = 10;
let d = -10; console.log(~c);
console.log(~d);
Trong ví dụ trên, toán tử NOT đảo ngược tất cả các bit (tức là, 0 → 1, 1 → 0v.v.), bao gồm các bit dấu.
Toán tử Shift trái (<<)
Toán tử dịch chuyển trái sẽ dịch chuyển các bit của một số đã cho sang trái. Toán tử lấy hai toán hạng: số cần dịch chuyển và số bit cần dịch chuyển.
Đây là cú pháp của toán tử dịch trái:
a << b
Ở đâu Một là toán hạng cho toán tử dịch trái, và b là số bit mà toán tử sẽ dịch chuyển toán hạng theo.
Toán tử dịch trái hoạt động bằng cách dịch từng bit của toán hạng sang trái theo số vị trí đã chỉ định và loại bỏ các bit thừa đã dịch sang trái.
Ví dụ:
let a = 50;
let b = 2;let result = a << b;
console.log(result);
Trong ví dụ trên, toán tử dịch chuyển trái đã dịch chuyển số thập phân 50 của nhị phân 00110010 sang hai vị trí. Giá trị nhị phân thu được là 11001000, là 200 dưới dạng số thập phân.
Toán tử dịch chuyển phải (>>) truyền bá ký hiệu
Sự dịch chuyển phải lan truyền dấu hiệu (>>) dịch chuyển các bit của một số sang phải trong khi giữ nguyên dấu của số ban đầu. Toán tử lấy hai toán hạng: số cần dịch chuyển và số bit cần dịch chuyển.
Đây là cú pháp cho toán tử dịch chuyển phải lan truyền dấu hiệu:
a >> b
Ở đâu Một là toán hạng cho toán tử dịch chuyển phải và b là số bit mà toán tử sẽ dịch chuyển toán hạng theo.
Toán tử dịch chuyển phải truyền ký hiệu hoạt động tương tự như toán tử dịch chuyển trái; sự khác biệt duy nhất trong phương thức hoạt động là sự thay đổi bên phải duy trì dấu hiệu.
Ví dụ:
let a = -50;
let b = 2;let result = a >> b;
console.log(result);
Trong ví dụ trên, toán tử dịch chuyển phải đã dịch chuyển dấu thập phân -50 (11001110) sang bên phải hai dấu cách dẫn đến dấu thập phân -13 (11110011).
Toán tử Shift phải không dấu (>>>)
Phép dịch phải không dấu (>>>) toán tử dịch chuyển các bit của một số sang phải theo một số vị trí đã chỉ định và lấp đầy các khoảng trống ở bên trái bằng các số không. Toán tử loại bỏ các bit dư thừa mà nó dịch chuyển sang bên phải.
Đây là cú pháp cho toán tử dịch chuyển phải không dấu:
a >>> b
Ở đâu Một là toán hạng cho toán tử dịch chuyển phải và b là số bit mà toán tử sẽ dịch chuyển toán hạng theo.
Toán tử dịch chuyển phải không dấu hoạt động tương tự như dịch chuyển phải. Tuy nhiên, không giống như toán tử dịch chuyển phải (>>) thì không bảo toàn dấu của một số khi dịch chuyển. Thay vào đó, nó coi số đó là số nguyên không dấu và điền bit ngoài cùng bên trái bằng số không.
Ví dụ:
let a = -5;
let b = 2;let result = a >>> b;
console.log(result);
Trong ví dụ này, toán tử dịch chuyển phải không dấu đã dịch chuyển “-5” sang phải hai dấu cách, loại bỏ dấu một cách hiệu quả và dẫn đến số thập phân “1073741822”.
Các ứng dụng của toán tử Bitwise
Bằng cách thao tác các bit riêng lẻ trong các số nhị phân, các toán tử bitwise có thể tạo ra chức năng phức tạp khó hoặc không thể đạt được bằng các phép toán số học truyền thống.
Hiểu cách sử dụng các toán tử bitwise có thể giúp bạn xây dựng các ứng dụng web hiệu quả và hiệu quả hơn.