Title Image

Blog Logo

Bài 17. Bitwise Operator

🌱 Bài 17. Toán tử Bitwise

     Bitwise là toán tử xử lý với các bit trong một số, nó là một toán tử rất quan trọng trong C, đặc biệt là C nhúng. Các toán tử bitwise cho phép xử lý với từng bit riêng lẻ trên một số nguyên, một thanh ghi. 

    ➤ Người dùng có thể set, clear, toggle, read a bit, ... mà không làm ảnh hưởng đến các thành phần khác của thanh ghi bằng toán tử bitwise. 

    ➤ Ví dụ vi điều khiển 8051 cho phép tác động tới từng bit của thanh ghi port, muốn tác động đến chân P1.0 thì ta dùng bit P1_0.

    Một số dòng vi điều khiển, hoặc IDE khác lại không cho phép điều này (chúng ta chỉ có thể tác động đến cả thanh ghi).

    ➤ Trường hợp khác là muốn tác động lên nhiều bit trong thanh ghi (khoảng 3 4 bit chẳng hạn), mà chỉ dùng 1 lệnh 😃

    Đây, xử lý với cả byte thì đơn giản rồi:

  • Muốn đảo cả byte: P2 = ~P2; (trong khi muốn đảo bit thì ta sử dụng P2_1 = !P2_1;
  • Muốn thay đổi giá trị cả byte: P2 = 0x5A; // P2 = 0b0101.1010

    Xử lý với bit (1 hoặc 1 vài bit) xem chừng khó khăn hơn:

    🧐🧐 Nếu MCU chỉ cho phép tác động đến byte, ta nên sử dụng kỹ thuật mặt nạ: "Mask" - Đó là cách sử dụng các phép AND (&), OR (|), EXOR (^) các thanh ghi với các số đặc biệt để chỉ tác động tới các bit cần thiết.

    ➤ Phép dịch bit

    🌱 Kỹ thuật mặt nạ bit - Bit Mask

    Chính là các áp dụng các phép logic trên (AND, OR, EXOR) cùng phép dịch bit <xem hình dưới>, để tác động đến 1 hoặc 1 vài bit của 1 thanh ghi, mà chỉ dùng 1 lệnh duy nhất 😃

    🧐🧐 Có thể xem một số áp dụng dưới đây để thấy sự ưu việt của kỹ thuật Bit - mask: hiệu quả, không phải nhớ nhiều, linh hoạt.

    🌱 Áp dụng

    👉👉 SET BITS - set 1 (1 vài) bit lên mức 1 => dùng OR

Ví dụ: set chân P1.4 lên mức 1

        Cách thông thường: P1_4 = 1;

        Cách sử dụng phép OR:

                    P1 |= 0x10;

        Cách sử dụng Bit - Mask:

                    P1 |= (1 << 4);

    👉👉 CLEAR BITS - clear 1 (1 vài) bit = 0 => dùng AND + NOT

Ví dụ: Clear chân P1.4 về mức 0

        Cách thông thường: P1_4 = 0;

        Cách sử dụng phép AND:

                    P1 &= ~0x10;

        Cách sử dụng Bit - Mask:

                    P1 &= ~(1 << 4);

        Clear 2 bit (hoặc nhiều hơn) - Clear P1.4 và P1.5:

                    P1 &= ~(0x03 << 4);

    👉👉 TOGGLE BITS - đảo logic 1 (1 vài) bit => dùng EXOR

Ví dụ: Đảo logic chân P1.4

        Cách thông thường:

                    if (P1_4 == 0) {
                        P1_4 = 1;
                    }
                    else {
                        P1_4 = 0;
                    }

        Cách sử dụng phép EXOR:

                    P1 ^= 0x10;

        Cách sử dụng Bit - Mask:

                    P1 ^= (1 << 4);

    👉👉 CHECKING BITS - Kiểm tra giá trị 1 bit => dùng AND

Ví dụ: Kiểm tra nút bấm tại chân P1.4

        Cách thông thường:

                    if (P1_4 == 0) hoặc if (!P1_4)

        Cách sử dụng phép AND:

                    if ((P1 & 0x10) == 0) hoặc if (!(P1 & 0x10))

        Cách sử dụng Bit - Mask:

                    if ((P1 & (1 << 4)) == 0) hoặc if (!(P1 & (1 << 4)))


    🌱 Kết luận

    Với 3 trường hợp trên, cách thông thường (cách 1) không áp dụng cho MCU chỉ cho phép tác động theo byte, trường hợp đảo bit phải dùng if -> dài dòng.

    Cách 2, phải nhớ mã hexa tương ứng với từng bit muốn tác động, khó thay đổi chương trình khi muốn thay đổi bit khác. Trường hợp đọc nút nhấn còn gây thay đổi các bit khác @@

    Cách 3, bit - mask -> chắc là ngon nhất rồi 😁😁😁

    Link tài liệu (slide) về các toán tử Bitwise, cách sử dụng, và một số công dụng thường gặp của chúng:

    Video giới thiệu về Bitwise trong C



>>>= Follow ngay =<<<

💚 Kênh Youtube Lập trình - Điện tử 💚

Để nhận được những bài học miễn phí mới nhất nhé 😊


Xem Bài 16                                Xem Bài 18

Đăng nhận xét

0 Nhận xét