var cvt []rune = []rune{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}

func toHex(num int) string {
	if num == 0 {
		return "0"
	}
	res := make([]rune, 0)
	//  Arithmetic shifts for signed integer and logical shifts for unsigned integer.
	for n := uint32(num); n != 0; n >>= 4 {
		res = append(res, cvt[n&0xf])
	}
	for l, r := 0, len(res)-1; l < r; l, r = l+1, r-1 {
		res[l], res[r] = res[r], res[l]
	}
	return string(res)
}