1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
//
// Copyright (C) 2014 Novartis Institutes for BioMedical Research
//
// @@ All Rights Reserved @@
// This file is part of the RDKit.
// The contents are covered by the terms of the BSD license
// which is included in the file license.txt, found at the root
// of the RDKit source tree.
//
#include <RDGeneral/export.h>
#pragma once
namespace RDKit {
namespace FMCS {
typedef unsigned long long BitSet;
class Composition2N { // generator of 2^N-1 possible bit combinations
BitSet Bits, InverseBits;
BitSet MaxValue, ValueMask; // need for inverse bitset must be 2^N-1
public:
Composition2N(BitSet maxValue, BitSet valueMask)
: Bits(0), InverseBits(0), MaxValue(maxValue), ValueMask(valueMask) {}
static void compute2N(unsigned power, BitSet& value) {
value = 1uLL << power;
}
BitSet getBitSet() const {
return InverseBits; // inverse to generate biggest seed first and then
// decrease number of external bonds
}
bool generateNext() {
if ((++Bits) <= MaxValue) {
InverseBits = (~Bits + 1) & ValueMask;
return true;
} else
return false;
}
bool is2Power() const { // one bit is set only
BitSet bits = getBitSet();
unsigned n = 0;
while (0 == (bits & 1uLL) &&
++n < sizeof(bits) * 8) // find lowest bitwise 1
bits >>= 1u; // shift all zero lower bits
if (0 != (bits & 1uLL)) bits >>= 1u; // shift first set bit too
return 0 == bits; // remained bits except lowest 1
}
// unused: bool nonZero() {return 0!=getBitSet();}
bool isSet(unsigned bit) const { return 0 != (getBitSet() & (1uLL << bit)); }
};
}
}
|