Advertisement
Guest User

Untitled

a guest
Oct 20th, 2014
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.49 KB | None | 0 0
  1. class BitArray
  2. include Enumerable
  3.  
  4. def initialize size
  5. @size = size
  6. @field = 2**size
  7. end
  8.  
  9. def set positions
  10. bits = positions.kind_of?(Integer) ? [positions] : positions
  11. bits.each { |position| @field |= 1 << (@size - position) }
  12. self
  13. end
  14.  
  15. def clear positions
  16. bits = positions.kind_of?(Integer) ? [positions] : positions
  17. bits.each { |position| @field ^= 1 << (@size - position) }
  18. self
  19. end
  20.  
  21. def get position
  22. (@field >> (@size - position) ).to_s(2)[-1].to_i
  23. end
  24.  
  25. def each(&block)
  26. @field.to_s(2)[1..-1].split("").each { |bit_string| yield(bit_string.to_i) }
  27. end
  28.  
  29. def to_s
  30. @field.to_s(2)[1..-1]
  31. end
  32.  
  33. def count
  34. @field.to_s(2)[1..-1].split("").inject(0) {|sum,bit| sum + bit.to_i}
  35. end
  36.  
  37. end
  38.  
  39. require 'minitest/autorun'
  40. require_relative 'bit_array'
  41.  
  42. class BitArrayTest < MiniTest::Unit::TestCase
  43.  
  44. def test_equal
  45. assert_equal "00000", BitArray.new(5).to_s
  46. end
  47.  
  48. def test_set
  49. assert_equal "00100", BitArray.new(5).set(3).to_s
  50. assert_equal "00010", BitArray.new(5).set(4).to_s
  51. assert_equal "11100", BitArray.new(5).set([1,2,3]).to_s
  52. assert_equal "100000000101", BitArray.new(12).set([1,10,12]).to_s
  53. end
  54.  
  55. def test_clear
  56. assert_equal "01000", BitArray.new(5).set([1,2]).clear(1).to_s
  57. end
  58.  
  59. def test_get
  60. assert_equal 0, BitArray.new(5).set([1,2]).get(3)
  61. assert_equal 0, BitArray.new(12).set([12]).get(11)
  62. assert_equal 0, BitArray.new(12).set([12]).get(1)
  63. end
  64.  
  65. def test_count
  66. assert_equal 2, BitArray.new(5).set([1,2]).count
  67. end
  68.  
  69. def test_iterate
  70. assert_equal ["0", "0", "0", "0", "0"], BitArray.new(5).each {|n| puts n }
  71. end
  72.  
  73. end
  74.  
  75. def each(&block)
  76. # block argument ignored, no iteration; passes tests anyway
  77. @field.to_s(2)[1..-1].split("")
  78. end
  79.  
  80. expected = [1, 1, 0]
  81. BitArray.new(3).set([1,2]).each do |bit|
  82. assert_equal expected.shift, bit
  83. end
  84. assert expected.empty? # check that we looped the expected number of times
  85.  
  86. def set *positions # use a splat
  87. positions.each { |position| @field |= 1 << (@size - position) }
  88. self
  89. end
  90.  
  91. def set *positions
  92. positions.each { |position| @field |= 2**position }
  93. self
  94. end
  95.  
  96. def count
  97. inject(0, :+)
  98. end
  99.  
  100. class BitArray
  101. include Enumerable
  102.  
  103. def initialize
  104. @bits = 0
  105. end
  106.  
  107. def set *positions
  108. positions.each { |position| @bits |= 2**position }
  109. self
  110. end
  111.  
  112. def unset *positions
  113. positions.each { |position| @bits ^= 2**position }
  114. self
  115. end
  116.  
  117. def get position
  118. (@bits >> position) & 1
  119. end
  120.  
  121. def each(&block)
  122. bits = @bits
  123. until bits == 0
  124. yield bits & 1
  125. bits = bits >> 1
  126. end
  127. end
  128.  
  129. def to_s
  130. @bits.to_s(2).reverse
  131. end
  132.  
  133. def count
  134. inject(0, :+)
  135. end
  136. end
  137.  
  138. require 'minitest/autorun'
  139.  
  140. class BitArrayTest < MiniTest::Test
  141. def test_equal
  142. assert_equal "0", BitArray.new.to_s
  143. end
  144.  
  145. def test_set
  146. assert_equal "0001", BitArray.new.set(3).to_s
  147. assert_equal "1011", BitArray.new.set(0, 2, 3).to_s
  148. assert_equal "0100000000101", BitArray.new.set(1, 10, 12).to_s
  149. end
  150.  
  151. def test_unset
  152. assert_equal "101", BitArray.new.set(0, 1, 2).unset(1).to_s
  153. end
  154.  
  155. def test_get
  156. assert_equal 1, BitArray.new.set(1, 2).get(2)
  157. assert_equal 0, BitArray.new.set(12).get(11)
  158. assert_equal 1, BitArray.new.set(12).get(12)
  159. end
  160.  
  161. def test_count
  162. assert_equal 3, BitArray.new.set(1, 2, 5).count
  163. end
  164.  
  165. def test_iterate
  166. expected = [1, 1, 0, 1]
  167. BitArray.new.set(0, 1, 3).each do |bit|
  168. assert_equal expected.shift, bit
  169. end
  170. assert expected.empty?
  171. end
  172. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement