File tree Expand file tree Collapse file tree 3 files changed +55
-21
lines changed Expand file tree Collapse file tree 3 files changed +55
-21
lines changed Original file line number Diff line number Diff line change @@ -171,3 +171,15 @@ internal fun Long.toHexString(): String {
171
171
172
172
return result.concatToString(i, result.size)
173
173
}
174
+
175
+ /* *
176
+ * Returns the number of characters required to encode [v]
177
+ * as a hexadecimal number without leading zeros (with `v == 0L` being the only exception,
178
+ * `hexNumberLength(0) == 1`).
179
+ */
180
+ internal inline fun hexNumberLength (v : Long ): Int {
181
+ if (v == 0L ) return 1
182
+ val exactWidth = (Long .SIZE_BITS - v.countLeadingZeroBits())
183
+ // Round up to the nearest full nibble
184
+ return ((exactWidth + 3 ) / 4 )
185
+ }
Original file line number Diff line number Diff line change @@ -149,27 +149,7 @@ public fun Sink.writeHexadecimalUnsignedLong(long: Long) {
149
149
return
150
150
}
151
151
152
- // Mask every bit below the most significant bit to a 1
153
- // http://aggregate.org/MAGIC/#Most%20Significant%201%20Bit
154
- var x = v
155
- x = x or (x ushr 1 )
156
- x = x or (x ushr 2 )
157
- x = x or (x ushr 4 )
158
- x = x or (x ushr 8 )
159
- x = x or (x ushr 16 )
160
- x = x or (x ushr 32 )
161
-
162
- // Count the number of 1s
163
- // http://aggregate.org/MAGIC/#Population%20Count%20(Ones%20Count)
164
- x - = x ushr 1 and 0x5555555555555555
165
- x = (x ushr 2 and 0x3333333333333333 ) + (x and 0x3333333333333333 )
166
- x = (x ushr 4 ) + x and 0x0f0f0f0f0f0f0f0f
167
- x + = x ushr 8
168
- x + = x ushr 16
169
- x = (x and 0x3f ) + ((x ushr 32 ) and 0x3f )
170
-
171
- // Round up to the nearest full byte
172
- val width = ((x + 3 ) / 4 ).toInt()
152
+ val width = hexNumberLength(v)
173
153
174
154
writeToInternalBuffer { buffer ->
175
155
val tail = buffer.writableSegment(width)
Original file line number Diff line number Diff line change
1
+ /*
2
+ * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
3
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file.
4
+ */
5
+
6
+ package kotlinx.io
7
+
8
+ import kotlin.test.Test
9
+ import kotlin.test.assertEquals
10
+
11
+ class UtilsTest {
12
+ @Test
13
+ fun hexNumberLength () {
14
+ val num2length: Map <Long , Int > = mapOf (
15
+ 0x1L to 1 ,
16
+ 0x10L to 2 ,
17
+ 0x100L to 3 ,
18
+ 0x1000L to 4 ,
19
+ 0x10000L to 5 ,
20
+ 0x100000L to 6 ,
21
+ 0x1000000L to 7 ,
22
+ 0x10000000L to 8 ,
23
+ 0x100000000L to 9 ,
24
+ 0x1000000000L to 10 ,
25
+ 0x10000000000L to 11 ,
26
+ 0x100000000000L to 12 ,
27
+ 0x1000000000000L to 13 ,
28
+ 0x10000000000000L to 14 ,
29
+ 0x100000000000000L to 15 ,
30
+ 0x1000000000000000L to 16 ,
31
+ - 1L to 16 ,
32
+ 0x3fL to 2 ,
33
+ 0x7fL to 2 ,
34
+ 0xffL to 2 ,
35
+ 0L to 1
36
+ )
37
+
38
+ num2length.forEach { (num, length) ->
39
+ assertEquals(length, hexNumberLength(num), " Wrong length for 0x${num.toString(16 )} " )
40
+ }
41
+ }
42
+ }
You can’t perform that action at this time.
0 commit comments