github.com/primecitizens/pcz/std@v0.2.1/core/bits/len.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // Copyright 2023 The Prime Citizens 3 // 4 // Copyright 2017 The Go Authors. All rights reserved. 5 // Use of this source code is governed by a BSD-style 6 // license that can be found in the LICENSE file. 7 8 package bits 9 10 import ( 11 "github.com/primecitizens/pcz/std/core/arch" 12 ) 13 14 // Len returns the minimum number of bits required to represent x; the result is 0 for x == 0. 15 func Len(x uint) int { 16 if arch.UintBits == 32 { 17 return Len32(uint32(x)) 18 } 19 return Len64(uint64(x)) 20 } 21 22 const Len8tab = "" + 23 "\x00\x01\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04\x04\x04\x04\x04" + 24 "\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05" + 25 "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" + 26 "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" + 27 "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + 28 "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + 29 "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + 30 "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + 31 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + 32 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + 33 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + 34 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + 35 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + 36 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + 37 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + 38 "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" 39 40 // Len8 returns the minimum number of bits required to represent x; the result is 0 for x == 0. 41 func Len8(x uint8) int { 42 return int(Len8tab[x]) 43 } 44 45 // Len16 returns the minimum number of bits required to represent x; the result is 0 for x == 0. 46 func Len16(x uint16) (n int) { 47 if x >= 1<<8 { 48 x >>= 8 49 n = 8 50 } 51 return n + int(Len8tab[x]) 52 } 53 54 // Len32 returns the minimum number of bits required to represent x; the result is 0 for x == 0. 55 func Len32(x uint32) (n int) { 56 if x >= 1<<16 { 57 x >>= 16 58 n = 16 59 } 60 if x >= 1<<8 { 61 x >>= 8 62 n += 8 63 } 64 return n + int(Len8tab[x]) 65 } 66 67 // Len64 returns the minimum number of bits required to represent x; the result is 0 for x == 0. 68 func Len64(x uint64) (n int) { 69 if x >= 1<<32 { 70 x >>= 32 71 n = 32 72 } 73 if x >= 1<<16 { 74 x >>= 16 75 n += 16 76 } 77 if x >= 1<<8 { 78 x >>= 8 79 n += 8 80 } 81 return n + int(Len8tab[x]) 82 }