log
Swift Code Chronicles

Efficient Permission Management with Binary and Bitwise Operations

Published on December 9, 2024
Updated on January 17, 2025
16 min read
TypeScriptJavaScript

Permission management is an inevitable part of developing administrative applications.


Traditional Approach to Permission Management.

Typically, user actions are divided into four categories: Create, Read, Update, and Delete, and we use constants to represent these actions. For example:

const READ = 1;
const WRITE = 2;
const UPDATE = 3;
const DELETE = 4;

If a user has the permissions for Read, Write, and Update, it is often represented like this:

const permission = [READ, WRITE, UPDATE];

While this approach is straightforward, it has its drawbacks:

  1. Increased Resource Usage: Using an array to represent permissions requires more resources for database storage and network transmission.
  2. Verbose Logic: For example, checking if a user has Write permission involves permission.includes(WRITE). While functional, repeating such patterns across the codebase can make it unnecessarily verbose.

A Better Solution: Binary and Bitwise Operations

To address these issues, we can use binary representation along with bitwise operations, which are both resource-efficient and concise.


Binary Representation of Permissions

We use constants to represent permissions, but now in binary format:

const READ = 0b1;      // Binary: 0001, Decimal: 1
const WRITE = 0b10;    // Binary: 0010, Decimal: 2
const UPDATE = 0b100;  // Binary: 0100, Decimal: 4
const DELETE = 0b1000; // Binary: 1000, Decimal: 8

In this scheme:

  • The 1st bit indicates the Read permission.
  • The 2nd bit indicates the Write permission, and so on.

Common Operations

1. Assigning Permissions

To assign a user the permissions for Read, Write, and Update, use the bitwise OR (|) operator:

const permission = READ | WRITE | UPDATE; // Binary: 0111, Decimal: 7
console.log(permission); // Output: 7

2. hecking Permissions

To check if a user has a specific permission, use the bitwise AND (&) operator:

if (permission & WRITE) {
    console.log("User has write permission");
} else {
    console.log("User does not have write permission");
}

3. Adding or Removing Permissions

To toggle a permission, use the bitwise XOR (^) operator:

// If DELETE is not in permissions, it will be added. If it is, it will be removed.
const newPermission = permission ^ DELETE;
console.log(newPermission);

Advantages

Using this method:

  • Permissions can be represented as a single number, reducing resource usage in database storage and network transmission.
  • Logic for checking, adding, and removing permissions becomes concise and readable.

For example:

  • A user with a permission value of 7 has a binary representation of 0111, meaning they have Read, Write, and Update permissions.
  • Checking for Write permission requires only: permission & WRITE.

Conclusion

Binary representation and bitwise operations provide an efficient and elegant way to manage permissions. This approach optimizes resource utilization while making the logic cleaner and more concise, making it an ideal choice for administrative applications.

About

A personal blog sharing technical insights, experiences and thoughts

Quick Links

Contact

  • Email: hushukang_blog@proton.me
  • GitHub

© 2025 Swift Code Chronicles. All rights reserved