BitArray from sloth

루비 | 2009/03/17 06:37 | Posted by DMW
크리에이티브 커먼즈 라이선스
Creative Commons License
원본
http://slothchord.tistory.com/352

쪼금 고쳐봤습니다.

# Ruby 1.86에서테스트
# 32비트 머신에서만 동작함
# Ruby의 Array 클래스가 제공하는 each, each_index, map, 그런거따위없다
# 먹고사는데(?) 꼭 필요한 것만 메세지로 제공하는데, 그 이유는 할줄 모르기 때문에서다.

class BitArray
    private
    
    SHIFTS = 0x05
    MASK = 0x01f
    
    def initialize(n)
        @n = n
        @tab_len = ((@n + 1) / 32) + 1
        @tab = Array.new(@tab_len, 0x00)
    end
    
    def at(i)
        return ((@tab[i >> SHIFTS] & (0x01 << (i & MASK))) != 0) ? 1 : 0
    end
    
    def set(i)
        @tab[i >> SHIFTS] |= (0x01 << (i & MASK))
    end
    
    def clr(i)
     @tab[i >> SHIFTS] &= ~(0x01 << (i & MASK))
    end
    
    public    
    attr_reader :n, :tab_len
    
    def []=(i, b)
        set(i) if (b == 1)
        clr(i) if (b == 0)
    end
    
    def [](i)
        return at(i)
    end
    
    def on?(i)
        return (at(i) == 1)
    end
    
    # 여기서부터 DMW의 코드
    # Enumerable을 사용하려면 each 메쏘드를 구현해야 한다.
    # 그리구 컬랙션에 들어있는 것들이 의미있는 <=>메소드를 제공해야 된다
    # each는 구현하면 되구 <=>는 문제업ㅂ어 보인다.
    include Enumerable
    def each
        @n.times do |i|
            yield at(i)
        end
    end
end


t = BitArray.new(4)
t[0] = 1
t[1] = 0
t[2] = 1
t[3] = 0

t.each { |i| puts i}
puts "Ahehheh"
a = t.map { |i| i = 0 }
a.each { |i| puts i }


Output:
1
2
3
4
5
6
7
8
9
1
0
1
0
Ahehheh
0
0
0
0


늅늅
저작자 표시 비영리 동일 조건 변경 허락

'루비' 카테고리의 다른 글

Queue  (6) 2009/09/22
tmpdir  (0) 2009/06/20
BitArray from sloth  (3) 2009/03/17
ruby 숫자에 세자리마다 쉼표를 집어넣기  (0) 2008/11/05
팩토리얼  (4) 2008/10/09
Ruby/SDL - 최근 근황  (1) 2008/09/30

댓글을 달아 주세요

  1. Favicon of http://www.filepang.co.kr BlogIcon DMW 2009/03/17 06:55  댓글주소  수정/삭제  댓글쓰기

    해놓고 보니까 sloth흉이랑 나랑 스탈이 좀 틀린거 같다.
    난 public을 위에 쓰는데...늘보흉은 private를 위에 쓰네;;

  2. Favicon of http://marocchino.tistory.com BlogIcon progr_ 2009/03/17 07:37  댓글주소  수정/삭제  댓글쓰기

    initialize(n) 이 프라이빗으로 들어가네요?
    오오 모르는거다 늅늅.

  3. sloth 2009/03/17 09:40  댓글주소  수정/삭제  댓글쓰기

    우오오 이제 BitArray도 each를 갔게 됐다는.... 업데이트해야지 캄사 늅늅