The three rules of Ruby Quiz:

1.  Please do not post any solutions or spoiler discussion for this quiz until
48 hours have passed from the time on this message.

2.  Support Ruby Quiz by submitting ideas as often as you can:

http://www.rubyquiz.com/

3.  Enjoy!

Suggestion:  A [QUIZ] in the subject of emails about the problem helps everyone
on Ruby Talk follow the discussion.  Please reply to the original quiz message,
if you can.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

by Aaron Patterson

Write a class that can represent a signed or unsigned number with an arbitrary
number of bits.  This class should support all bitwise operations ( & ^ ~ | ),
basic math operations ( + - / * ), and comparison operators.  It would behave
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 session
number 2 ).  Another is how to handle numbers that are wider than the specified
number of bits.  I'm not really sure how to handle that part, but what I do is
just take the last N number of bits.  So if 0xFFEE was passed in to my 8 bit
vector, I would just take 0xEE.

	Example irb sessions

Here is an example of using an 8 bit unsigned int with an initial value of 0xFF:

	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>