lab.nexedi.com/kirr/go123@v0.0.0-20240207185015-8299741fa871/xmath/math18.go (about)

     1  // Copyright (C) 2017-2019  Nexedi SA and Contributors.
     2  //                          Kirill Smelkov <kirr@nexedi.com>
     3  //
     4  // This program is free software: you can Use, Study, Modify and Redistribute
     5  // it under the terms of the GNU General Public License version 3, or (at your
     6  // option) any later version, as published by the Free Software Foundation.
     7  //
     8  // You can also Link and Combine this program with other software covered by
     9  // the terms of any of the Free Software licenses or any of the Open Source
    10  // Initiative approved licenses and Convey the resulting work. Corresponding
    11  // source of such a combination shall include the source code for all other
    12  // software used.
    13  //
    14  // This program is distributed WITHOUT ANY WARRANTY; without even the implied
    15  // warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    16  //
    17  // See COPYING file for full licensing terms.
    18  // See https://www.nexedi.com/licensing for rationale and options.
    19  
    20  //go:build !go1.9
    21  // +build !go1.9
    22  
    23  package xmath
    24  
    25  // CeilPow2 returns minimal y >= x, such that y = 2^i.
    26  func CeilPow2(x uint64) uint64 {
    27  	if x == 0 {
    28  		return x
    29  	}
    30  
    31  	l := uint(0)
    32  	h := uint(63)
    33  	for l < h {
    34  		i := (l + h) / 2
    35  		y := uint64(1) << i
    36  
    37  		switch {
    38  		case y < x:
    39  			l = i + 1
    40  		case y > x:
    41  			h = i
    42  		default:
    43  			// y == x
    44  			return y
    45  		}
    46  	}
    47  
    48  	return 1 << h
    49  }