Toán tử bit
Toán tử dịch bit xem các toán hạng của nó như là một chuỗi nhị phân 32 bit (gồm các số 0 và 1) thay vì là các số thập phân, bát phân hoặc thập lục phân. Ví dụ: số thập phân 9
được biểu diễn nhị phân là 1001
, toán tử dịch bit sẽ thực hiện các phép toán trên biểu diễn nhị phân này, nhưng kết quả trả về là một giá trị số chuẩn của JavaScript.
- Tất cả các số trong JavaScript được lưu trữ dưới dạng số dấu phẩy động 64 bit với gốc là 10. JavaScript không phải là một ngôn ngữ kiểu, khác với nhiều ngôn ngữ lập trình khác, JavaScript không xác định các loại số khác nhau như số nguyên, số ngắn, số dài, số dấu phẩy động, v.v.
- Độ chính xác của số nguyên (không sử dụng dấu chấm hoặc ký hiệu mũ) là tối đa 15 chữ số. Độ chính xác của số dấu phẩy động là tối đa 17 chữ số, nhưng phép tính dấu phẩy động không luôn chính xác 100%.
- Toán tử dịch bit thực hiện các phép toán trực tiếp trên các bit nhị phân của số, nó là một phép toán rất cơ bản, ưu điểm là tốc độ rất nhanh, nhưng nhược điểm là không thể sử dụng trong nhiều trường hợp.
- Toán tử dịch bit chỉ hoạt động với số nguyên, nếu một toán hạng không phải là số nguyên, nó sẽ tự động chuyển đổi thành số nguyên trước khi thực hiện phép toán.
- Trong JavaScript, số được lưu trữ dưới dạng số dấu phẩy động 64 bit, nhưng khi thực hiện phép dịch bit, nó được thực hiện trên số nguyên 32 bit có dấu và kết quả trả về cũng là một số nguyên 32 bit có dấu.
Các toán tử dịch bit
JavaScript có tổng cộng 7 toán tử dịch bit.
Toán tử AND bit
Toán tử AND bit (&
) kết hợp các bit tương ứng trong các số nhị phân theo một cách đặc biệt, nếu cả hai bit tương ứng đều là 1, thì kết quả là 1, nếu bất kỳ bit nào là 0 thì kết quả là 0.
Toán tử OR bit
Toán tử OR bit (|
) khác với toán tử &
ở chỗ nếu bất kỳ bit tương ứng nào trong hai toán hạng là 1 thì kết quả là 1.
Toán tử XOR bit
Toán tử XOR bit (^
) cho kết quả là 1 nếu chỉ có một trong hai bit tương ứng là 1, các trường hợp khác đều là 0.
Toán tử NOT bit
Toán tử NOT bit (~
) là phép đảo bit, 1 thành 0, 0 thành 1, tức là lấy phần đảo của biểu diễn nhị phân.
Ghi nhớ đơn giản: Tổng của một số và đảo của nó bằng -1.
Dịch trái
Toán tử dịch trái (<<
) dịch tất cả các bit của giá trị chỉ định sang trái một số lần xác định, quy tắc dịch: Loại bỏ bit cao, thêm bit 0 ở dưới, tức là dịch tất cả các số thành hệ nhị phân tương ứng sang trái số lần tương ứng, các bit cao bị loại bỏ (bỏ qua), các bit thấp được điền vào bằng số 0.
Dịch phải có dấu
Dịch phải có dấu (>>
) sẽ dịch các bit của toán hạng chỉ định sang phải một số lần xác định. Các bit bị dịch ra phía bên phải sẽ bị loại bỏ và bit trái nhất sẽ được sao chép để điền vào bên trái. Vì bit trái nhất luôn giống như trước đó, nên bit dấu không thay đổi. Do đó, nó được gọi là truyền dấu.
Dịch phải không dấu
Dịch phải không dấu (>>>
) sẽ dịch toán hạng đầu tiên sang phải một số lần xác định. Các bit bị dịch ra phía bên phải sẽ bị loại bỏ và được điền vào bên trái bằng số 0. Vì bit dấu trở thành 0, nên kết quả luôn là số không âm. (Chú ý: Ngay cả khi dịch 0 bit, kết quả vẫn là số không âm.)
Tổng kết
Toán tử | Cú pháp | Mô tả |
---|---|---|
AND bit | a & b | Trả về 1 nếu cả a và b tương ứng là 1, ngược lại trả về 0 |
OR bit | a | b | Trả về 1 nếu ít nhất một trong a và b tương ứng là 1, ngược lại trả về 0 |
XOR bit | a ^ b | Trả về 1 nếu chỉ có một trong a và b tương ứng là 1, ngược lại trả về 0 |
NOT bit | ~ a | Đảo ngược các bit của toán hạng |
Dịch trái | a << b | Dịch tất cả các bit của giá trị a sang trái b lần, các bit mới được điền vào bằng 0 |
Dịch phải | a >> b | Dịch tất cả các bit của giá trị a sang phải b lần, các bit bị mất đi |
Dịch phải 0 | a >>> b | Dịch tất cả các bit của giá trị a sang phải b lần, các bit bị mất đi và được điền 0 |
Thực hành tốt nhất
Lấy phần nguyên
Sử dụng ~
、>>
、<<
、>>>
、|
để lấy phần nguyên.
Hoán đổi giá trị
Sử dụng XOR bit ^
để hoán đổi giá trị.
XOR cũng thường được sử dụng trong mã hóa.
Chuyển đổi giá trị thập phân sang nhị phân
Chuyển đổi giá trị màu
Sử dụng &
、>>
、|
để chuyển đổi giữa giá trị màu RGB và giá trị màu hex.
Kiểm tra dấu
Kiểm tra dấu giống nhau
Thường, chúng ta sử dụng x * y > 0
để so sánh xem hai số có cùng dấu hay không. Nhưng nếu sử dụng XOR bit ^
, tốc độ tính toán sẽ nhanh hơn.
Kiểm tra số lẻ hay chẵn
Sử dụng toán tử &
để kiểm tra một số là lẻ hay chẵn.
Nếu biểu diễn số n
dưới dạng nhị phân, chỉ cần kiểm tra bit nhị phân cuối cùng là 1 hay 0 là được.
Kiểm tra sự tồn tại của chỉ mục
Đây là một kỹ thuật phổ biến, ví dụ như kiểm tra một số có tồn tại trong một mảng hay không:
Vì: ~-1 === 0
-1 được biểu diễn nhị phân là toàn bit 1, sau khi thực hiện phép NOT bit ~
, kết quả sẽ trở thành toàn bit 0. Điều này cho thấy rằng số có toàn bit 1 trong bộ nhớ được biểu diễn như thế nào. Các số khác không có toàn bit 1, vì vậy kết quả của phép NOT bit sẽ không phải là 0. Do đó, chúng ta có thể sử dụng tính chất này để kiểm tra indexOf
, giúp mã nguồn trở nên ngắn gọn hơn.