Left shift (<<)

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Toán tử left shift (<<) trả về một số hoặc BigInt có biểu diễn nhị phân là toán hạng đầu tiên được dịch chuyển sang trái theo số bit đã chỉ định. Các bit thừa bị dịch ra khỏi bên trái sẽ bị loại bỏ, và các bit zero được đưa vào từ bên phải.

Try it

const a = 5; // 00000000000000000000000000000101
const b = 2; // 00000000000000000000000000000010

console.log(a << b); // 00000000000000000000000000010100
// Expected output: 20

Cú pháp

js
x << y

Mô tả

Toán tử << được nạp chồng cho hai kiểu toán hạng: number và BigInt. Với number, toán tử trả về số nguyên 32-bit. Với BigInt, toán tử trả về BigInt. Đầu tiên, nó ép kiểu cả hai toán hạng về giá trị số và kiểm tra kiểu của chúng. Nó thực hiện BigInt left shift nếu cả hai toán hạng đều trở thành BigInt; nếu không, nó chuyển đổi cả hai toán hạng về số nguyên 32-bit và thực hiện left shift trên số. TypeError được ném ra nếu một toán hạng trở thành BigInt nhưng toán hạng kia trở thành number.

Toán tử hoạt động trên biểu diễn bit của toán hạng bên trái theo dạng bù hai (two's complement). Ví dụ, 9 << 2 cho kết quả 36:

     9 (base 10): 00000000000000000000000000001001 (base 2)
                  --------------------------------
9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10)

Dịch chuyển trái một số nguyên 32-bit x sang trái y bit cho kết quả x * 2 ** y. Vì vậy, ví dụ, 9 << 3 tương đương với 9 * (2 ** 3) = 9 * (8) = 72.

Nếu toán hạng bên trái là một số có nhiều hơn 32 bit, các bit có trọng số cao nhất sẽ bị loại bỏ. Ví dụ, số nguyên sau có nhiều hơn 32 bit sẽ được chuyển đổi thành số nguyên 32-bit:

Before: 11100110111110100000000000000110000000000001
After:              10100000000000000110000000000001

Toán hạng bên phải sẽ được chuyển đổi thành số nguyên 32-bit không dấu và sau đó lấy modulo 32, vì vậy độ lệch dịch chuyển thực tế luôn là một số nguyên dương từ 0 đến 31, bao gồm cả hai đầu. Ví dụ, 100 << 32 giống như 100 << 0 (và tạo ra 100) vì 32 modulo 32 là 0.

Warning: Bạn có thể thấy người ta dùng << 0 để cắt ngắn số thành số nguyên. Left shift bất kỳ số x nào sang trái 0 bit trả về x được chuyển đổi thành số nguyên 32-bit, đồng thời loại bỏ các bit đầu cho các số ngoài khoảng -2147483648 đến 2147483647. Hãy dùng Math.trunc() thay thế.

Với BigInt, không có cắt ngắn. Về mặt khái niệm, hiểu rằng các BigInt dương có vô số bit 0 đứng đầu, và các BigInt âm có vô số bit 1 đứng đầu.

Ví dụ

Sử dụng left shift

js
9 << 3; // 72

// 9 * (2 ** 3) = 9 * (8) = 72

9n << 3n; // 72n

Thông số kỹ thuật

Specification
ECMAScript® 2027 Language Specification
# sec-left-shift-operator

Khả năng tương thích với trình duyệt

Xem thêm