0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Ứng dụng Bit và Các Phép Toán Bitwise trong Lập Trình: Tối Ưu Hóa Tốc Độ và Bộ Nhớ

Đăng vào 2 ngày trước

• 3 phút đọc

Ứng dụng Bit và Các Phép Toán Bitwise trong Lập Trình

Sử dụng các phép toán bitwise là một phương pháp tuyệt vời và tối ưu trong lập trình, không chỉ về tốc độ tính toán mà còn về hiệu quả sử dụng bộ nhớ. Tuy nhiên, không phải tất cả các nhà phát triển đều nắm rõ và ứng dụng chúng trong công việc hàng ngày của mình. Bài viết này sẽ trình bày ba trường hợp thực tế để áp dụng bit và các phép toán bitwise trong lập trình, giúp bạn hiểu rõ hơn về lợi ích của chúng. Xem thêm mã nguồn tại: Github repo.

1. Lưu và Xử Lý Quyền Truy Cập

Thay vì lưu trữ các quyền truy cập thành các giá trị tách biệt, chúng ta có thể lưu trữ chúng thành một bit trong một byte dữ liệu. Ví dụ, để phân quyền cho 4 quyền truy cập phổ biến: Đọc, Ghi, Thực thi và Từ chối, chúng ta có thể sử dụng 4 bit như sau: 0b0000. Nếu người dùng có nhiều quyền khác nhau, việc tổng hợp các quyền này cũng trở nên đơn giản và nhanh chóng hơn. Chúng ta chỉ cần sử dụng phép AND để kiểm tra quyền tương ứng.

Ví dụ, để kiểm tra quyền Ghi, chúng ta có bản ghi quyền Ghi mặc định là 0b0100. Dù có bao nhiêu bản ghi, nếu OR tất cả lại và sau đó AND với bản ghi quyền Ghi, kết quả sẽ cho biết người dùng có quyền hay không.

Ví dụ mã nguồn:

csharp Copy
public enum Permissions
{
    Read = 0x1,
    Write = 0x2,
    Execute = 0x4,
    Denied = 0x8,
}

Để lưu lại quyền Đọc và Ghi cho người dùng:

Copy
Permissions = Permissions.Read | Permissions.Write

Để kiểm tra quyền:

Copy
CanRead = (permissions) => (permissions & Permissions.Read) == Permissions.Read

2. Sử Dụng Trong Game

Khi phát triển game, việc quản lý trạng thái của trò chơi thông qua các bit hoặc các ma trận bit là một cách hiệu quả. Chúng ta có thể thấy rõ sự ưu việt khi so sánh việc sử dụng bit so với các mảng hai chiều để lưu trữ bản đồ trò chơi. Các thao tác như xác nhận bắn trúng mục tiêu có thể được thực hiện một cách nhanh chóng cùng với việc giảm thiểu bộ nhớ sử dụng.

Ví dụ mã nguồn:

csharp Copy
public class Map
{
    public byte[] Rows { get; set; } = { 0, 0, 0, 0, 0, 0, 0, 0 };
}

public void Shoot(int x, int y)
{
    var rowOnMap = map.Rows[x];
    var rowOnShoot = (byte)1 << y;
    if ((rowOnMap & rowOnShoot) == rowOnShoot)
    {
        Console.WriteLine("Accurate!");
    }
    else
    {
        Console.WriteLine("Missed");
    }
}

3. Cộng Dồn Các Tùy Chọn

Một ứng dụng khác mà bạn có thể thấy rõ sự hữu ích của việc sử dụng bit là trong việc lưu trữ các tùy chọn của một hàm. Khi kết hợp các tùy chọn này bằng phép OR, ta có thể lưu trữ chúng trong một số nguyên. Ví dụ, chúng ta có thể danh sách các kênh thông báo như Email, SMS và thông báo trên ứng dụng di động, bằng cách sử dụng enum như sau:

csharp Copy
public enum NotificationChannels
{
    None = 0,
    Email = 0x1,
    Sms = 0x2,
    Mobile = 0x4,
    All = 0x7
}

Một phương thức có thể lấy ra các đối tượng gửi tin nhắn tương ứng với mỗi tùy chọn thông qua việc kiểm tra đơn giản:

csharp Copy
public IEnumerable<INotificationSender> GetSenders(NotificationChannels channels)
{
    var senders = this.serviceProvider.GetServices<INotificationSender>();
    if (channels == NotificationChannels.All)
    {
        return senders;
    }
    return senders.Where(sender => (sender.Channel & channels) == sender.Channel);
}

Kết Luận

Trên đây là một số chia sẻ nhằm giúp các bạn mới vào nghề nắm vững cách áp dụng các phép toán bit và bitwise vào thực tiễn. Dù các ngôn ngữ lập trình và khả năng tính toán đã phát triển, việc nắm bắt những kiến thức cơ bản như bit và phép toán bitwise vẫn luôn giữ vai trò quan trọng và thú vị trong lập trình.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào