Toán tử >> (Right Shift) dịch chuyển các bit của toán hạng trái sang phải n vị trí (toán hạng phải).
Quy tắc
- Signed integer (int, long): Arithmetic shift — bit dấu (MSB) được複製 (sign extension). Ví dụ:
-8 >> 1 = -4. - Unsigned integer (uint, ulong): Logical shift — bit cao được điền 0. Ví dụ:
0x80000000u >> 1 = 0x40000000.
Ví dụ: 60 >> 2
60 (dec) = 0011 1100 (bin) Dịch phải 2: 0000 1111 = 15 (dec)
Mã nguồn
using System;
namespace Demo {
class Program {
static void Main() {
int a = 60; // 0011 1100
int b = a >> 2; // 0000 1111 = 15
Console.WriteLine("a = {0} (0b{1})", a, Convert.ToString(a, 2).PadLeft(8, '0'));
Console.WriteLine("a >> 2 = {0} (0b{1})", b, Convert.ToString(b, 2).PadLeft(8, '0'));
Console.ReadLine();
}
}
}
Kết quả
a = 60 (0b00111100)
a >> 2 = 15 (0b00001111)
Ứng dụng
- Chia nhanh cho 2ⁿ (chỉ số nguyên dương):
x >> n≈x / (1 << n). - Trích xuất bit:
(value >> pos) & 1lấy bit tại vị trípos. - Bit masking: Dịch để align mask.
- Fixed-point math: Q-format scaling.
Lưu ý
- Khác với toán học:
-5 >> 1 = -3(arithmetic shift), nhưng-5 / 2 = -2(truncation toward zero). - Dịch quá số bit của kiểu (vd:
int >> 32) → C# chỉ lấy 5 bit thấp của shift count (count & 0x1Fcho int,& 0x3Fcho long). - Không dùng cho float/double — dùng
Math.ScaleBhoặc nhân/chia.