github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/merkle/util.go (about)

     1  /*
     2   * Copyright (C) 2018 The ontology Authors
     3   * This file is part of The ontology library.
     4   *
     5   * The ontology is free software: you can redistribute it and/or modify
     6   * it under the terms of the GNU Lesser General Public License as published by
     7   * the Free Software Foundation, either version 3 of the License, or
     8   * (at your option) any later version.
     9   *
    10   * The ontology is distributed in the hope that it will be useful,
    11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13   * GNU Lesser General Public License for more details.
    14   *
    15   * You should have received a copy of the GNU Lesser General Public License
    16   * along with The ontology.  If not, see <http://www.gnu.org/licenses/>.
    17   */
    18  
    19  package merkle
    20  
    21  func countBit(num uint64) uint {
    22  	var count uint
    23  	for num != 0 {
    24  		num &= (num - 1)
    25  		count += 1
    26  	}
    27  	return count
    28  }
    29  
    30  func isPower2(num uint64) bool {
    31  	return countBit(num) == 1
    32  }
    33  
    34  // 1-based index
    35  func highBit(num uint64) uint {
    36  	var hiBit uint
    37  	for num != 0 {
    38  		num >>= 1
    39  		hiBit += 1
    40  	}
    41  	return hiBit
    42  }
    43  
    44  func lowBit(num uint64) uint {
    45  	return highBit(num & -num)
    46  }