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 }