1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
7 // FormatUint returns the string representation of i in the given base,
8 // for 2 <= base <= 36. The result uses the lower-case letters 'a' to 'z'
9 // for digit values >= 10.
10 func FormatUint(i
uint64, base
int) string {
11 _
, s
:= formatBits(nil, i
, base
, false, false)
15 // FormatInt returns the string representation of i in the given base,
16 // for 2 <= base <= 36. The result uses the lower-case letters 'a' to 'z'
17 // for digit values >= 10.
18 func FormatInt(i
int64, base
int) string {
19 _
, s
:= formatBits(nil, uint64(i
), base
, i
< 0, false)
23 // Itoa is shorthand for FormatInt(int64(i), 10).
24 func Itoa(i
int) string {
25 return FormatInt(int64(i
), 10)
28 // AppendInt appends the string form of the integer i,
29 // as generated by FormatInt, to dst and returns the extended buffer.
30 func AppendInt(dst
[]byte, i
int64, base
int) []byte {
31 dst
, _
= formatBits(dst
, uint64(i
), base
, i
< 0, true)
35 // AppendUint appends the string form of the unsigned integer i,
36 // as generated by FormatUint, to dst and returns the extended buffer.
37 func AppendUint(dst
[]byte, i
uint64, base
int) []byte {
38 dst
, _
= formatBits(dst
, i
, base
, false, true)
43 digits
= "0123456789abcdefghijklmnopqrstuvwxyz"
46 var shifts
= [len(digits
) + 1]uint{
54 // formatBits computes the string representation of u in the given base.
55 // If neg is set, u is treated as negative int64 value. If append_ is
56 // set, the string is appended to dst and the resulting byte slice is
57 // returned as the first result value; otherwise the string is returned
58 // as the second result value.
60 func formatBits(dst
[]byte, u
uint64, base
int, neg
, append_
bool) (d
[]byte, s
string) {
61 if base
< 2 || base
> len(digits
) {
62 panic("strconv: illegal AppendInt/FormatInt base")
64 // 2 <= base && base <= len(digits)
66 var a
[64 + 1]byte // +1 for sign of 64bit value in base 2
75 // common case: use constants for / because
76 // the compiler can optimize it into a multiply+shift
78 if ^uintptr(0)>>32 == 0 {
79 for u
> uint64(^uintptr(0)) {
81 us
:= uintptr(u
- q
*1e9
) // us % 1e9 fits into a uintptr
82 for j
:= 9; j
> 0; j
-- {
85 a
[i
] = byte(us
- qs
*10 + '0')
92 // u guaranteed to fit into a uintptr
97 a
[i
] = byte(us
- q
*10 + '0')
102 a
[i
] = byte(us
+ '0')
104 } else if s
:= shifts
[base
]; s
> 0 {
105 // base is power of 2: use shifts and masks instead of / and %
107 m
:= uintptr(b
) - 1 // == 1<<s - 1
110 a
[i
] = digits
[uintptr(u
)&m
]
115 a
[i
] = digits
[uintptr(u
)]
123 a
[i
] = digits
[uintptr(u
-q
*b
)]
128 a
[i
] = digits
[uintptr(u
)]
138 d
= append(dst
, a
[i
:]...)