2017-01-10 2 views
1

비트 연산자는 이해하기 어렵습니다. 루비 코드를 자세히 설명 할 수 있습니까?루비 프로그래밍의 비트 연산자

def res(n) 
~(~1<<((2*n)>>1)) 
end 

res(5) --> 63 
+0

[비트 시프트 (비트 시프트) 연산자 란 무엇이며 어떻게 작동합니까?] (http://stackoverflow.com/questions/141525/what-are-bitwise-shift-bit-shift-operators -and-how-do-they-work) –

+0

@EliSadoff 연결된 질문에'~'에 대한 언급이 없습니다. –

+0

함께 거기에 묶여있다. 어떤 유용한 목적이 있습니까 아니면 누군가의 샘플/예일뿐입니다? –

답변

8

첫째, 연산자 우선 순위 이해하자 2

  • >>1에 의해

    # 5 3 4 1 2 
        ~(~1<<((2*n)>>1)) 
    
    1. 2*nn이 두 작업은 완전히 중복 만들기 2하여 결과를 분할, 원래의 코드는 100입니다 %와 동등한 %는 ~(~1<<n)
    2. 012 3,816,175,는 0b01 것이 -2입니다 -0b10,
    3. base<<power가, 배의 전력이다 따라서 우리는 -2^(5+1) = -64
    4. 비트 보수 다시 -0b1000000에서 0b0111111을 생산해야하는 bitwise complement이다.
  • +0

    우수 답변! 가장 안쪽의 괄호 세트가 중복된다는 것을 주목하라. ((2 * n) >> 1) == (2 * n >> 1) # => true'. –

    1

    업데이트 편집.

    우리는 무슨 일이 벌어지고 어떤 순서로 여기에 있을지도 모릅니다. 먼저 표현의 중복성에 대한 첫 번째 답변에 공헌 해주십시오. 나는 간단한 것으로 시작한다.

    def bitwise_complement_bits(args) 
        ~ args 
    end 
    
    def bitwise_shift_left(o, n) 
        o << n 
    end 
    
    a = bitwise_complement_bits(1) 
    b = bitwise_shift_left(a, 5) 
    p bitwise_complement_bits(b) 
    

    업데이트 편집 : 난 그냥 우리가 여기서 무엇을했다에 붙여

    Here's a nifty site for some quick evaluation of code.

    . 당신은 거기에 발을 디디면서 실제로 무슨 일이 벌어지고 있는지 보게 될 것입니다.

    또는 repl.it뿐만 아니라 직접 설치할 수도 있습니다. https://repl.it/languages/ruby 재미있게 보내십시오!

    +0

    간결한, 요점과 직접 직접 문제를 해결합니다. 기다림... – cobaltsoda