Skip to content

Instantly share code, notes, and snippets.

@ocombe
Created May 23, 2018 11:33
Show Gist options
  • Save ocombe/55e0f440bf475599b4c886f19807635e to your computer and use it in GitHub Desktop.
Save ocombe/55e0f440bf475599b4c886f19807635e to your computer and use it in GitHub Desktop.

Bitwise operations

Using bitwise operations is blazing fast for the VM. Here is how you can encode and use information: First you have to determine the number of operations that you need to encode to know how many bits you need, based on 2^n, where n is the number of bits, and 2^n the number of operations that you can encode.

For example if I have 5 operations, I need 3 bits (2^2 = 4 operations, and 2^3 = 8 operations). Then you can encode the operations in an enum. Each operation will have a different number, and you need to shift each operation by 32 bits - n (for 5 operations and 3 bits, we will shift by 32-3=29).

The last thing that you need is the mask, which will be used to decode the operations.

const enum OPERATIONS {
  WRITE  = 1 << 29,
  READ   = 2 << 29,
  CREATE = 3 << 29,
  REMOVE = 4 << 29,
  INSERT = 5 << 29,
  UNMASK = (1 << 29) - 1,
  MASK   = ~((1 << 29) - 1),
}

Now you can use those flags to store both the operation and a value (that needs to fit in the x bits left, in our case 29). For example if you want to store the index 7, and the operation read, you can do: const x = 7 | OPERATIONS.READ;.

You can then test the operation with MASK and extract the value with UNMASK:

if ((x & OPERATIONS.MASK) === OPERATIONS.READ) {
  const index = x & I18N.UNMASK;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment