2013-10-08 10 views
0

루비를 사용하여 정수 값에서 이진 왼쪽 시프트를 수행하는 방법은 무엇입니까? (자바)루비 이진 왼쪽 시프트

:


나는 왼쪽 시프트 이항 연산을 할 노력하고있어하지만 난 이상한 문자 대신 이동의 받고 있어요 ..

는 나는 다음과 같이 수행해야한다고 생각

b = (b >> 2); // 0011 1111
b = (b < < 2); // 1111 1100

내가 루비에서 이런 일을 해요 :

currentRed = ChunkyPNG::Color.r(image[x,y]) 
currentGreen = ChunkyPNG::Color.g(image[x,y]) 
currentBlue = ChunkyPNG::Color.b(image[x,y]) 

binRed = currentRed.to_s.unpack("b*")[0] 
binGreen = currentGreen.to_s.unpack("b*")[0] 
binBlue = currentBlue.to_s.unpack("b*")[0] 

puts "original" 

puts "r #{binRed}" 
puts "g #{binGreen}" 
puts "b #{binBlue}" 

puts "------" 

binRed = binRed << 2 

binGreen = binGreen << 2 
binBlue = binBlue << 2 


puts "new" 

puts "r #{binRed}" 
puts "g #{binGreen}" 
puts "b #{binBlue}" 

을하고하는 것은 점점 :

enter image description here

사전에 감사합니다 ..

+1

무엇이 당신의 질문입니까? – sawa

+0

rgb 값을 정수 바이너리 형식으로 변환하는 방법은 무엇입니까? rgb 값을 다음과 같이 바이너리 형식으로 변환 해 보았습니다. binRed = currentRed.to_s (2) \t binGreen = currentGreen.to_s (2) \t binBlue = currentBlue.to_s (2) 그러나 printscreen과 같은 결과가 나타납니다. 위 .. 아직도 문자열 때문에 .. – Alexandre

답변

4

귀하의 binRed, binGreen , binBlueb*의 비트 스트림을 에 풀면 실제 문자열입니다.. 문자열의 경우 <<은 append를 의미하므로 이상한 문자 (문자 코드 2)가 인쇄 된 것은 당연합니다.

나는 ChunkyPNG에 익숙하지 해요,하지만 currentRed는, currentGreen, currentBlue 이미 정수처럼 doc에서 보인다. 직접 비트 시프트를 수행 할 수 있어야합니다.

+0

Worakam, 당신 말이 맞아요. 그렇습니다. 그렇습니다. currentRed, currentGreen 및 currentBlue는 정수이지만 rgb 값입니다. 바이너리로 변환 한 다음 비트 쉬프트를 수행해야합니다 ... do 당신은 이것을하는 방법을 안다? – Alexandre

+0

바이너리로 변환 할 필요가 없습니다. (바이너리에서는 바이너리이기 때문에) 바이너리로 변환 할 필요가 없습니다. 그냥 'currentRed << 2'를하면 2 비트가 왼쪽으로 이동합니다 ... 원본에서와 같이 24 비트까지 자르기를 원하면 0xFFFFFF로 마스크 할 수 있습니다. 그래서'currentRed = (currentRed << 2) & 0xFFFFFF'와 같은 것이 여러분의 필요를 채워 줄 것입니다. –

+0

내가있어 이렇게 : --------- 원래 R (253) g 253 B (253) ------ 맞습니다 새로운 R 1012 g 1012 B 1012 ? PNG에 내 데이터를 넣으려고 마지막으로 중요한 비트를 변경하려고하기 때문에 왼쪽 이동이 필요합니다. – Alexandre