정수가 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)
) 및 문자열을 가로 지르는로 정수를 변환 고려하지만, 훨씬 깨끗하고 직접적인 방법이 있어야한다 같은 느낌했습니다.
코드는 나를 위해 작동합니다. 그 비트가 나중에 설정되었다는 것을 어떻게 확인합니까? 루비 숫자에 "최상위 비트"가 없다는 것을 알고 있다고 가정합니다. 거대한 정수와 함께 행복하게 작업 할 수 있습니다. '2 ** 500000 -1'. . . 32 비트 (또는 64 비트)에서자를 것이라고 기대하는 것만 큼 문제가 있습니까? –
[이 질문과 체크 표시 된 답변] (http://stackoverflow.com/questions/9445760/bit-shifting-in-ruby)을보십시오. –
@NeilSlater 정수를 이진 문자열로 변환하고 출력은 왼쪽에있는 비트를 1로 설정 한 길이가 32자인 문자열입니다. 여기서 다루는 정수는 IPv4 주소이므로 절대 길이가 32 비트를 초과해서는 안됩니다 . – Ben