mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2025-01-05 22:54:10 -08:00
Fix to[Hex/Octal/Binary]String for unsigned values
This commit is contained in:
parent
06f8ed6a7c
commit
4ebaf476fe
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2018 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.impl;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.lang.TCharacter;
|
||||||
|
|
||||||
|
public final class IntegerUtil {
|
||||||
|
private IntegerUtil() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toUnsignedLogRadixString(int value, int radixLog2, int size) {
|
||||||
|
if (value == 0) {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
|
||||||
|
int radix = 1 << radixLog2;
|
||||||
|
int mask = radix - 1;
|
||||||
|
int sz = (size - Integer.numberOfLeadingZeros(value) + radixLog2 - 1) / radixLog2;
|
||||||
|
char[] chars = new char[sz];
|
||||||
|
|
||||||
|
int pos = (sz - 1) * radixLog2;
|
||||||
|
int target = 0;
|
||||||
|
while (pos >= 0) {
|
||||||
|
chars[target++] = TCharacter.forDigit((value >>> pos) & mask, radix);
|
||||||
|
pos -= radixLog2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new String(chars);
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,6 +15,8 @@
|
||||||
*/
|
*/
|
||||||
package org.teavm.classlib.java.lang;
|
package org.teavm.classlib.java.lang;
|
||||||
|
|
||||||
|
import static org.teavm.classlib.impl.IntegerUtil.toUnsignedLogRadixString;
|
||||||
|
|
||||||
public class TInteger extends TNumber implements TComparable<TInteger> {
|
public class TInteger extends TNumber implements TComparable<TInteger> {
|
||||||
public static final int SIZE = 32;
|
public static final int SIZE = 32;
|
||||||
public static final int MIN_VALUE = 0x80000000;
|
public static final int MIN_VALUE = 0x80000000;
|
||||||
|
@ -39,15 +41,15 @@ public class TInteger extends TNumber implements TComparable<TInteger> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toHexString(int i) {
|
public static String toHexString(int i) {
|
||||||
return toString(i, 16);
|
return toUnsignedLogRadixString(i, 4, SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toOctalString(int i) {
|
public static String toOctalString(int i) {
|
||||||
return toString(i, 8);
|
return toUnsignedLogRadixString(i, 3, SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toBinaryString(int i) {
|
public static String toBinaryString(int i) {
|
||||||
return toString(i, 2);
|
return toUnsignedLogRadixString(i, 1, SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toString(int i) {
|
public static String toString(int i) {
|
||||||
|
|
|
@ -172,15 +172,35 @@ public class TLong extends TNumber implements TComparable<TLong> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toHexString(long i) {
|
public static String toHexString(long i) {
|
||||||
return toString(i, 16);
|
return toUnsignedLogRadixString(i, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toOctalString(long i) {
|
public static String toOctalString(long i) {
|
||||||
return toString(i, 8);
|
return toUnsignedLogRadixString(i, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toBinaryString(long i) {
|
public static String toBinaryString(long i) {
|
||||||
return toString(i, 2);
|
return toUnsignedLogRadixString(i, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String toUnsignedLogRadixString(long value, int radixLog2) {
|
||||||
|
if (value == 0) {
|
||||||
|
return "0";
|
||||||
|
}
|
||||||
|
|
||||||
|
int radix = 1 << radixLog2;
|
||||||
|
int mask = radix - 1;
|
||||||
|
int sz = (SIZE - numberOfLeadingZeros(value) + radixLog2 - 1) / radixLog2;
|
||||||
|
char[] chars = new char[sz];
|
||||||
|
|
||||||
|
long pos = (sz - 1) * radixLog2;
|
||||||
|
int target = 0;
|
||||||
|
while (pos >= 0) {
|
||||||
|
chars[target++] = TCharacter.forDigit((int) (value >>> pos) & mask, radix);
|
||||||
|
pos -= radixLog2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new String(chars);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toString(long value) {
|
public static String toString(long value) {
|
||||||
|
|
|
@ -150,4 +150,14 @@ public class IntegerTest {
|
||||||
assertNull(Integer.getInteger("test.baz"));
|
assertNull(Integer.getInteger("test.baz"));
|
||||||
assertNull(Integer.getInteger(null));
|
assertNull(Integer.getInteger(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void toHex() {
|
||||||
|
assertEquals("0", Integer.toHexString(0));
|
||||||
|
assertEquals("1", Integer.toHexString(1));
|
||||||
|
assertEquals("a", Integer.toHexString(10));
|
||||||
|
assertEquals("11", Integer.toHexString(17));
|
||||||
|
assertEquals("ff", Integer.toHexString(255));
|
||||||
|
assertEquals("ffffffff", Integer.toHexString(-1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user