Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bit banging in ruby

I want to create a bit, that will contain security permissions for a given user.

In c#, I would do this by creating an enumeration, and then I would do some bit banging on the binary value, by anding '&&' to see if it results in a TRUE value.

How can I do this best in Ruby?

like image 591
Blankman Avatar asked Oct 05 '10 21:10

Blankman


3 Answers

If the underlying value is important then you can create a module that you use like an enum

module Groups
  ADMIN = 1
  BOSS = 2
  CLERK = 4
  MEAT = 8
  BREAD = 16
  CHEESE = 32
end

To set permissions just bitwise or them together

permissions = Groups::BOSS | Groups::MEAT | Groups::CHEESE

and to test you do a bitwise and

>> permissions & Groups::CHEESE > 0
=> true
>> permissions & Groups::BREAD > 0
=> false

I also like how you can make actual bitmasks more readable with _ like this

permissions = 0b0010_1010
like image 96
Jonas Elfström Avatar answered Oct 03 '22 11:10

Jonas Elfström


Bitwse operations are trivial in Ruby.

> 1 | 2 # Create a bitmask from permission 2^0 + 2^1
=> 3

> 3 & 1 == 1 # See if the bitmask contains the 2^0 permission
=> true

> 3 & 4 == 4 # See if the bitmask contains the 2^2 permission
=> false
like image 37
Chris Heald Avatar answered Oct 03 '22 12:10

Chris Heald


Ryan Bates talks about using bitwise operations for embedding associations in this podcast. You can read text version here.

like image 23
retro Avatar answered Oct 03 '22 11:10

retro