결과의 값은 음수 여야하지만 양수 여야합니다.Java에서 길이가 길어질 큰 16 진수 값이 0보다 작 으면
어떻게 해결할 수 있습니까?
감사합니다.
BigInteger b = new BigInteger ("80000000000000004308000000000000", 16);
System.out.println ("long value :"+ b.longValue());
-> 긴 값 : 4830110600354856960
결과의 값은 음수 여야하지만 양수 여야합니다.Java에서 길이가 길어질 큰 16 진수 값이 0보다 작 으면
어떻게 해결할 수 있습니까?
감사합니다.
BigInteger b = new BigInteger ("80000000000000004308000000000000", 16);
System.out.println ("long value :"+ b.longValue());
-> 긴 값 : 4830110600354856960
http://download.oracle.com/javase/1,5,0/docs/api/java/math/BigInteger.html#longValue%28%29
는 음수가 될 수 없습니다 이유를 이해하려면 위의 페이지를 참조하십시오. 낮은 64 비트를 반환하므로 음수 값을 발생 시키려면 마지막 64 비트가 Long.MAX_VALUE보다 높아야합니다.
당신은 항상 128 비트 번호가 가장 높은 비트가 다음 다음 줄을 사용할 수있는 기호입니다 가정하면 :
BigInteger neg = BigInteger.ONE.shiftLeft(127);
BigInteger b = new BigInteger("80000000000000004308000000000000", 16);
if(b.compareTo(neg) >= 0) {
b = neg.subtract(b);
}
참고 : 비트의 수가에 맞는 경우 b.longValue()
에만 적합 할 것 이러한 많은 수의 경우에는 그렇지 않을 수도 있습니다.
문자열 표현은 부호가있는 long이지만 서명되지 않은 문자열로 표시됩니다 (기호는 문자열 시작 부분에 "-"를 사용하여 표시됩니다).
비트는 이동 또는 문자열이 문자열 인스턴스에서이 일을하는 데 필요한 수정.
가장 좋은 대답은 문자열을 바이트 배열로 변환하고 2의 보수에 따라 음수 또는 양수를 인식하는 BigInteger(byte[] val) 인스턴스화를 사용하는 것이라고 생각합니다. 해당 문자열에서 바이트 배열로 변환하는 경우 Many options이 존재합니다. 골라보세요.
... 오, 너의 숫자가 너무 길어서 길게 갈 수 없으니, 역시 문제가 될 것이다. 당신은 최하위 비트를 얻습니다.
이해가 안됩니다. 왜 그것이 부정적이어야합니까? – Nican
@ 니카노 그의 수는 실제로 4로 시작하고 길게 들어 맞습니다. 나는 처음에 8이 2의 보수를 사용하여 기호를 나타내는 시도라고 생각합니다. –
@JeffFerland 숫자가 음수라고 가정하면 BigNumber 생성자가 지정됩니다. 선택적 "-"기호를 앞에 붙여야합니다. – Nican