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  }