2013-05-28 1 views
3

현재 파일 내의 오프셋을 나타내는 정수 값을 다루고 있습니다. 그러나 16 비트 경계에서 정렬해야하는 숫자는 있지만이를 수행하는 방법은 조금 확실하지 않습니다. 예를 들어Java 16 비트 정렬

는 :

First number: 89023 
16-bit aligned: 89024 

Second number: 180725 
16-bit aligned: 180736 

Third number: 263824 
Already 16-bit aligned, don't need to change it. 

이 나에게 무엇보다 실패 아마 내 수학이지만, 누군가가 자바에서이를 달성하는 방법에 대한 조언을 할 수 있다면, 나는 그것을 감사하겠습니다.

감사합니다.

:

업데이트 난 그냥 그것을 해결했다고 생각

, 그 다음 그래서 예를 들면 16

에서 누락 무슨 운동을, 16 값을 모딩 단지 문제

180725 % 16 = 5 
16 - 5 = 11 
180725 aligned to 16-bits is: 180736 

누군가 내가 올바르게하고 있는지 확인할 수 있습니까?

+1

예, 다음 16 비트 정렬로 반올림됩니다. – Farlan

+0

대단히 고마워! – Tony

답변

2

예. 작동합니다. 16 비트 경계 정렬은 16의 배수가 될 것이라고 확신합니다. 여기서 수행하는 작업은 값이 반올림되어 다음 값인 16에 도달하도록하는 것입니다.

// find how far off of alignment you are, 0-15 
offset = num % 16 
// determine how much further you need to move the value to achieve 16 bit alignment 
// only use if offset > 0, otherwise you are already good 
val = 16 - offset 
+0

대단히 감사합니다! – Tony

+2

16은 2의 거듭 제곱이기 때문에이를 달성하는 더 빠른 방법은'(num + 15) & ~ 16'을 계산하는 것입니다. – fge

+1

@ fge'(num + 15) & ~ 15'가 더 잘 작동합니다. – assylias

2

두 가지 가능성이 다른 대답/설명에 설명되어 있습니다. 다음은 전체 구현입니다.

public static int getAlignment_modulus() { 
    int offset = num % 16; 
    int result = offset == 0 ? num : num + 16 - offset; 
    return result; 
} 

public static int getAlignment_bitOps() { 
    return (num + 15) & ~15; 
}