= Solution
Extract one four-bit digit at a time, beginning at the most significant end of the <Java> `int`. A lookup string supplies characters, but no library performs the conversion:
``
java
static String toHex(int value) {
String digits = "0123456789abcdef";
String answer = "";
boolean started = false;
for (int shift = 28; shift >= 0; shift -= 4) {
int digit = (value >>> shift) & 15;
if (started || digit != 0 || shift == 0) {
answer = answer + digits.charAt(digit);
started = true;
}
}
return answer;
}
``
The logical right <bit shift> `>>>` inserts zeros, and the <bit mask> `15` retains exactly the low four bits of the shifted word. Each emitted character is therefore the corresponding <hexadecimal> digit. The `started` flag suppresses leading zero digits; the `shift == 0` exception makes zero produce \b[`"0"`], rather than an empty string.
A negative <Java> integer uses <two's complement>. Its top bit is set, so the first extracted digit is between eight and fifteen and all eight digits are emitted. We interpret its original 32-bit pattern, without taking an absolute value or negating a potentially unnegatable minimum integer. In particular, \b[`toHex(19)` returns `"13"`, `toHex(-1)` returns `"ffffffff"`, and `toHex(Integer.MIN_VALUE)` returns `"80000000"`.] There are exactly eight iterations, so for this fixed word size the <time complexity> is constant.
Back to article page