public function testNumberOfTrailingZeros() { $this->assertEquals(32, BitUtils::numberOfTrailingZeros(0)); $this->assertEquals(1, BitUtils::numberOfTrailingZeros(10)); $this->assertEquals(0, BitUtils::numberOfTrailingZeros(15)); $this->assertEquals(2, BitUtils::numberOfTrailingZeros(20)); }
/** * Gets the next unset bit position from a given position. * * @param integer $from * @return integer */ public function getNextUnset($from) { if ($from >= $this->size) { return $this->size; } $bitsOffset = $from >> 5; $currentBits = ~$this->bits[$bitsOffset]; $bitsLength = count($this->bits); $currentBits &= ~((1 << ($from & 0x1f)) - 1); while ($currentBits === 0) { if (++$bitsOffset === $bitsLength) { return $this->size; } $currentBits = ~$this->bits[$bitsOffset]; } $result = ($bitsOffset << 5) + BitUtils::numberOfTrailingZeros($currentBits); return $result > $this->size ? $this->size : $result; }