The three rules of Ruby Q.:
Please do not post any solutions or spoiler discussion for this quiz
48 hours have passed from the time on this message.
Support Ruby Q. by submitting ideas as often as you can:
Suggestion: A [QUIZ] in the subject of emails about the problem helps
on Ruby T. follow the discussion. Please reply to the original quiz
if you can.
by Aaron P.
Write a class that can represent a signed or unsigned number with an
number of bits. This class should support all bitwise operations ( & ^
~ | ),
basic math operations ( + - / * ), and comparison operators. It would
like an integer in C (except with arbitrary length!), so an unsigned int
0xFFFFFFFF + 1 would equal 0x00000000.
One edge case is what to do in an overflow case ( see the first irb
number 2 ). Another is how to handle numbers that are wider than the
number of bits. I’m not really sure how to handle that part, but what I
just take the last N number of bits. So if 0xFFEE was passed in to my 8
vector, I would just take 0xEE.
Example irb sessions
Here is an example of using an 8 bit unsigned int with an initial value
irb(main):001:0> n = UnsignedFixedWidthInt.new(0xFF, 8) => 255 irb(main):002:0> n += 2 => 1 irb(main):003:0> n = n << 1 => 2 irb(main):004:0> n = n >> 1 => 1 irb(main):005:0> ~n => 254 irb(main):006:0> n += 12 => 13 irb(main):007:0> n = n & 0x0E => 12 irb(main):008:0>
Now an example of an 8 bit signed int with an initial value of 0x01:
irb(main):001:0> n = SignedFixedWidthInt.new(0x01, 8) => 1 irb(main):002:0> n = n << 7 => -128 irb(main):003:0> n -= 1 => 127 irb(main):004:0> n = n >> 6 => 1 irb(main):005:0> n -= 2 => -1 irb(main):006:0> n = n ^ 0xF3 => 12 irb(main):007:0> n = n | 0x01 => 13 irb(main):008:0>
Here is an example of handling numbers that are too wide:
irb(main):001:0> n = UnsignedFixedWidthInt.new(0x0, 8) => 0 irb(main):002:0> n += 0xFFEE => 238 irb(main):003:0>