Vì không ai nói về chủ đề tại sao những điều này hữu ích:
Tôi sử dụng các thao tác bitwise rất nhiều khi làm việc với cờ. Ví dụ: nếu bạn muốn chuyển một loạt cờ cho một thao tác (giả sử File.Open()
, với chế độ Đọc và chế độ Viết đều được bật), bạn có thể chuyển chúng dưới dạng một giá trị. Điều này được thực hiện bằng cách gán cho mỗi cờ có thể là bit riêng của nó trong một bitet (byte, short, int hoặc long). Ví dụ:
Read: 00000001
Write: 00000010
Vì vậy, nếu bạn muốn vượt qua đọc VÀ viết, bạn sẽ vượt qua (READ | WRITE) sau đó kết hợp cả hai thành
00000011
Mà sau đó có thể được giải mã ở đầu bên kia như:
if ((flag & Read) != 0) { //...
kiểm tra nào
00000011 &
00000001
trả về
00000001
không phải là 0, vì vậy cờ không chỉ định READ.
Bạn có thể sử dụng XOR để chuyển đổi các bit khác nhau. Tôi đã sử dụng điều này khi sử dụng cờ để chỉ định đầu vào định hướng (Lên, Xuống, Trái, Phải). Ví dụ: nếu một sprite đang di chuyển theo chiều ngang và tôi muốn nó quay lại:
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
Tôi chỉ đơn giản là XOR giá trị hiện tại với (LEFT | RIGHT) sẽ tắt LEFT và RIGHT, trong trường hợp này.
Bit Shifting rất hữu ích trong một số trường hợp.
x << y
giống như
x * 2 y
nếu bạn cần nhanh chóng nhân với một lũy thừa hai, nhưng coi chừng chuyển 1 bit thành bit trên cùng - điều này làm cho số âm trừ khi nó không được ký. Nó cũng hữu ích khi xử lý các kích thước khác nhau của dữ liệu. Ví dụ: đọc một số nguyên từ bốn byte:
int val = (A << 24) | (B << 16) | (C << 8) | D;
Giả sử rằng A là byte có ý nghĩa nhất và D ít nhất. Nó sẽ kết thúc như:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
Màu sắc thường được lưu trữ theo cách này (với byte đáng kể nhất bị bỏ qua hoặc được sử dụng làm Alpha):
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
Để tìm lại các giá trị, chỉ cần dịch chuyển các bit sang phải cho đến khi nó ở dưới cùng, sau đó che đi các bit có thứ tự cao hơn còn lại:
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
0xFF
cũng giống như 11111111
. Vì vậy, về cơ bản, đối với Red, bạn sẽ làm điều này:
Color >> 16 = (filled in 00000000 00000000)11111111 00010101 (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)