2014-05-22 2 views
0

이 질문은 전에 질문했을 수도 있지만 정확한 일치를 찾을 수 없어서 시도해 볼 것입니다.float 배열을 바이트 배열로 효율적으로 캐스팅

는 내가 배열의 각 float의 마지막 8 비트를 유지하려는 의미 하나 float이 (등 정보의 손실) 캐스팅 될 방법으로 float[]byte[] A를 캐스팅하고 싶다. ByteBuffer와 관련된 코드를 발견했지만이 방법은 각 float의 모든 32 비트를 원하는 출력이 아닌 4 바이트 (각각 8 비트)로 변환했습니다 (누군가가 관심이있는 경우 링크는 http://www.javalobby.org/java/forums/t18962.html입니다)

이 주조를위한 코드 그래서 난 그냥 고전 for 루프를 사용 찾을 : 내가 인식하지 오전 같은 결과를 달성하기 위해보다 효율적인 방법이 있는지

public static byte[] float2ByteArray(float floatArray[]) { 
    byte[] byteArray = new byte[floatArray.length]; 
    for(int i = 0; i < floatArray.length; i++) { 
     byteArray[i] = (byte) floatArray[i]; 
    } 
    return byteArray; 
} 

내 질문은?

+0

이 특정 루프에 성능 문제가 있습니까? – Kayaman

+6

> "하나의 플로트가 캐스팅 (정보 손실 등)되어 배열의 각 플로트의 마지막 8 비트 만 유지하려고합니다." 이것은 float -> byte 변환이 Java에서 작동하는 방식이 아닙니다. –

+0

배열은 얼마나 걸립니까? – StephaneM

답변

1

루프를 사용하는 일반적인 방법이 있습니다. 루프 구조 (언 롤링 등)를 사용하여 성능을 몇 % 향상시킬 수도 있지만 일반적으로 기능 개발의 마지막 단계에서 신경 써야 할 부분입니다.

여기에 더 많은 문제는 부동 소수점 에 맞는지 확인하지 않는 것입니다. 인해 INT보다 작은 데이터 타입 캐스트로 수행하는 동작을위한 자바 (약간 특이한) 시멘틱스 : 플로트 값 바이트들의 범위를 초과하는 경우

byte b = (byte) floatValue; 

매우 추한 놀라움 초래할 수있다. 암시 적으로이 변환이 작동하기 때문에 다음과 같이

int i = (int) floatValue; 
byte b = (byte) i; 

그리고 당신이 직관적으로 기대하는 것 아니라고. floatValue 을 int가 아닌 바이트가 아닌 바이트 수로 채우는 경우 최종 바이트 값은 이 잘린 int 값이됩니다. 그래서 예를 들면 : 0 (제로)의 바이트 값

float f = 256F; 
byte b = (byte) f; 

결과, 하나는 일반적으로 기대하지 127로. 그것을 조심하고 둥근/캐스팅하기 전에 그에 따라 플로트 값을 자르십시오.

성능면에서 float -> int/byte cast가 여기에서 (요소 당) 가장 비용이 많이 드는 작업입니다.

+0

감사합니다. 왜냐하면 그것은 단지 rgb 값이 산술적 이유로 float으로 형 변환 되었기 때문입니다. 전체적인 아이디어는 입력 이미지 파일을 다시 읽는 것보다 메모리에서 변환하는 것입니다. – Eypros

+0

@Eypros 캐스트 구문이 사용 사례에서 문제가되지 않는다면 코드는 정상적으로 처리되어야합니다. 나는이 변환의 성능에 대해 너무 많이 걱정하지 않을 것입니다. 프로그램이하는 일이 훨씬 더 많은 시간을 할애 할 가능성이 높기 때문에 여기에서 많은 두뇌 능력을 사용하면 성능 측면에서 거의 수익을 내지 못할 것입니다. – Durandal

관련 문제