Giá trị (int) value & 0x1, (int) value & 0x2, (int) value & 0x4, (int) value & 0x8 có nghĩa là gì? "


11

mã

"Giá trị" nằm trong khoảng từ 0 đến 15 (giá trị có thể của nó). Khi nào thì 4 điều kiện "nếu" được đáp ứng? Nếu giá trị (int) của tôi = 2 có nghĩa là 0010?

            if  ((int)value & 0x1) 
            {
                //statement here
            }
            if  ((int)value & 0x2) 
            {
                //statement here
            }
            if  ((int)value & 0x4) 
            {
                //statement here
            }
            if  ((int)value & 0x8) 
            {
                //statement here
            }

3
Đó là các bitmasks kiểm tra các bit riêng lẻ của value(đọc if(value & 0x4)là "Là bit thứ 3 của valuetập hợp (= 1)). Vì bạn dường như có vấn đề trong việc hiểu mã, tôi cho rằng nó không phải là của bạn. Đây (và thực tế là bạn không hỏi để xem xét) làm cho câu hỏi này off-topic cho CR.SE .
Không ai

Để hiểu rõ hơn, mã tương tự đã được chuyển sang C # sẽ sử dụng Enum.HasFlagphương thức để kiểm tra bit. Xem: Enum.HasFlag .
rwong

Câu trả lời:


12

Mỗi số có thể được biểu thị như value = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...với mỗi b là một 0hoặc 1(đây là các bit của biểu diễn). Đây là đại diện nhị phân.

Nhị phân AND ( &) đưa mỗi bcặp đó trở nên khôn ngoan và thực hiện AND trên chúng. Điều này có kết quả đầu ra sau đây:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

Sử dụng quyền hạn 2 (chỉ có một bit duy nhất), chúng ta có thể cô lập và kiểm tra các bit riêng lẻ:

  • value & 1đúng khi valuelẻ {1, 3, 5, 7, 9, 11, 13, 15}.

  • value & 2đúng khi value/2lẻ {2, 3, 6, 7, 10, 11, 14, 15}.

  • value & 4đúng khi value/4lẻ {4, 5, 6, 7, 12, 13, 14, 15}.

  • value & 8đúng khi value/8lẻ {8, 9, 10, 11, 12, 13, 14, 15}.

Tiền tố 0x trên các số có nghĩa là nó nên được hiểu là số thập lục phân . Đó là một chút thừa thãi khi bạn chỉ lên đến 0x8 nhưng nói với các nhà bảo trì, nó có thể được sử dụng như một bitmask.


1
Từ ngữ có thể gợi ý rằng nó có thể được mở rộng cho tất cả các số, điều này không đúng: 8/6là số lẻ, trong khi 8&6mang lại sai.
Sjoerd

@Sjoerd đó là lý do tại sao tôi nói "sức mạnh của 2"
ratchet freak

5

Các câu lệnh if này kiểm tra nếu một bit cụ thể valueđược đặt.

0x4Ví dụ, giá trị thập lục phân có bit thứ 3 từ bên phải được đặt thành 1và tất cả các bit khác được đặt thành 0. Khi bạn sử dụng nhị phân - và toán tử ( &) với hai toán tử, kết quả sẽ có tất cả các bit được đặt thành 0ngoại trừ các bit có 1 trong cả hai toán tử.

Vì vậy, khi bạn thực hiện phép tính value & 0x4, bạn có thể nhận được nhị phân 00000000hoặc nhị phân 00000100, tùy thuộc vào việc bit thứ 3 value1hay 0. Khối thứ nhất ước tính falsevà thứ hai là true, do đó, khối if chỉ được thực thi cho các giá trị trong đó bit thứ 3 được đặt.


1

Có hai điều thú vị cần lưu ý ở đây.

Đầu tiên, đây là một mẫu chung để kiểm tra từng bit 4 bậc thấp của một giá trị tích phân. Điều kiện if được đáp ứng nếu bit tương ứng được đặt. Đối với giá trị 2, mẫu bit thực sự là 0010.

Câu hỏi thú vị khác là tại sao các (int)diễn viên? Ngoài phong cách sử dụng phôi C trong C ++, không có giá trị số nguyên hoặc ký tự nào yêu cầu ép kiểu này. Một bool không có ý nghĩa, một double / float sẽ được chuyển đổi thành một số nguyên tạm thời và sẽ là bất thường khi sử dụng các giá trị bằng chữ để kiểm tra một enum. Nó có thể có ý nghĩa với một con trỏ, nhưng đó sẽ là một cách sử dụng rất chuyên biệt. Kết luận: dàn diễn viên không có ý nghĩa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.