프로그래밍 방식으로 값 유형의 크기 계산
-
22-07-2019 - |
문제
부울 값을 바이트로 압축하는 메서드에 대한 단위 테스트를 작성 중입니다.다양한 비트 위치는 현재 값이 5개만 있는 열거형의 값에 의해 결정되지만 이 숫자가 9가 될 수 있다는 것은 상상할 수 있습니다(극히 가능성은 낮음).
다음과 같은 간단한 테스트를 원합니다.
개인 바이트 m_myNum;열거형 MyEnum {...}
주장(sizeof(m_myNum) <= MyEnum.values().length);
Java에는 sizeof 함수가 없다는 인상을 받았습니다.가장 우아한 해결 방법은 무엇입니까?
---편집하다
내 생각엔 내가 분명하지 않았던 것 같아.나는 정상적인 런타임에 대해 걱정하지 않습니다.내 문제는 이제 모든 정보를 저장하는 바이트를 사용하여 이 코드를 작성할 수 있다는 것입니다. 그러나 코드의 관련 없는 부분에서 Enum이 커지면 비트마스킹 코드가 중단되는 지점에 도달할 수 있습니다.배포된 애플리케이션에서 이를 수행하는 대신 열거형의 상태 수가 저장소 변수의 비트 수를 초과할 때 실패하는 단위 테스트를 갖고 싶습니다. 따라서 프로그래머가 9번째 열거형을 추가하면 이를 조정할 수 있습니다. 변수의 유형을 8비트보다 큰 것으로 변경합니다.
해결책
내 생각엔 이 테스트가 당신이 원하는 대로 이루어졌다고 생각해요.이보다 더 일반적인 내용을 알아보는 것은 아마도 시간 낭비일 것입니다.
public void testEnumSizeLessThanOneByte() throws Exception
{
assertTrue("MyEnum must have 8 or less values.",
MyEnum.values().length <= 8);
}
다른 팁
이것이 실제로 문제이고 성능이 그다지 중요하지 않은 경우 항상 비트셋
Java 바이트는 고정된 크기(8비트)를 가지므로 sizeof가 필요하지 않습니다.
첫째, 그렇습니다. Java에는 sizeof 연산자가 없습니다.그러나 sizeof(byte)는 항상 1입니다.이게 정말 당신이 말하려던 게 맞나요?
둘째, 9개의 부울을 1바이트에 어떻게 맞추려고 했나요?비트마스크는 아니길 바랍니다.
설정된 가장 높은 비트를 찾으려면 다음을 사용할 수 있습니다. Integer.highestOneBit(m_myNum & 0xFF)
(문서 참조 여기).
편집하다:열거형에 값이 너무 많으면 저장소를 더 큰 유형으로 변경하는 것에 대해 이야기했습니다.에 따르면 이 질문, 메모리를 사용하지 않을 이유가 없습니다. byte
대신에 int
배열이 없으면.그래서 나는 int
최소한으로 업그레이드하고 long
크기가 32를 초과하는 경우.충분히 간단합니까?
나는 당신이 일반적인 해결책을 찾으려고 노력하고 있다는 것을 알고 있지만, 이 경우에는 게으른 방법을 택하고 크기를 하드 코딩하고 몇 가지 설명을 추가할 것입니다.
static final int MAX_BITS_IN_MY_NUM = 8; // Currently set to size of a byte. // Update if data type changes from byte to something larger than a byte. ... assertTrue(MAX_BITS_IN_MY_NUM >= MyEnum.values().length);