2014-07-16 2 views
1

정수가 common_bits이고 상위 순서 (가장 왼쪽) 비트의 값을 결정하려고합니다. 비트가 1이면 왼쪽으로 1 비트 (common_bits = common_bits << 1) 시프트하고 카운터를 증가 시키려면 bitlength입니다.루비 : 정수의 상위 비트 값을 어떻게 결정합니까?

나는 상위 비트 인 경우 1 common_bits이 왼쪽으로 이동할 것 같은 while 문 내에서 common_bits으로 AND 마스크에 노력했다. 그러나, 작동하지 않으며 while 종료 후 common_bits에 상위 1 비트로 끝납니다.

CHECK_MASK = 0b10000000000000000000000000000000 

bitlength = 0 
p "Starting common_bits is #{common_bits.to_s(2)}" 

while ((common_bits & CHECK_MASK) == CHECK_MASK) 
    common_bits = (common_bits << 1) & 0xffffffff 
    bitlength = bitlength + 1 
    p "bitlength is #{bitlength}. common_bits is #{common_bits.to_s(2)}" 
end 

p "Final common_bits is #{common_bits.to_s(2)}" 
p "Final bitlength is #{bitlength}" 

가 나는 바이너리 문자열 (common_bits.to_s(2)) 및 문자열을 가로 지르는로 정수를 변환 고려하지만, 훨씬 깨끗하고 직접적인 방법이 있어야한다 같은 느낌했습니다.

+0

코드는 나를 위해 작동합니다. 그 비트가 나중에 설정되었다는 것을 어떻게 확인합니까? 루비 숫자에 "최상위 비트"가 없다는 것을 알고 있다고 가정합니다. 거대한 정수와 함께 행복하게 작업 할 수 있습니다. '2 ** 500000 -1'. . . 32 비트 (또는 64 비트)에서자를 것이라고 기대하는 것만 큼 문제가 있습니까? –

+0

[이 질문과 체크 표시 된 답변] (http://stackoverflow.com/questions/9445760/bit-shifting-in-ruby)을보십시오. –

+0

@NeilSlater 정수를 이진 문자열로 변환하고 출력은 왼쪽에있는 비트를 1로 설정 한 길이가 32자인 문자열입니다. 여기서 다루는 정수는 IPv4 주소이므로 절대 길이가 32 비트를 초과해서는 안됩니다 . – Ben

답변

2

Ruby는 정수를 32 비트 또는 특정 비트 길이로 자릅니다. 필요한 경우 내부 표현을 Bignum 클래스로 "업그레이드"하고 계속 진행합니다. 32 비트는 제한이 없으며, 64 비트도 1024 비트도 아닙니다. . .

예를 들어 경계로 유지되는 정수가 필요한 경우 32 비트 부호없는, 당신은 오버플로 수있는 모든 작업 후 자신을해야 해 :

CHECK_MASK = 0b10000000000000000000000000000000 

while ((common_bits & CHECK_MASK) == CHECK_MASK) 
     common_bits = (common_bits << 1) & 0xffffffff 
end 
+0

이것은 정확히 무엇이 빠졌던가입니다. 원래의 질문을 업데이트하여 현재 작동중인 코드를 반영합니다. 감사! – Ben

관련 문제