Add bit twiddling class

git-svn-id: http://php-reader.googlecode.com/svn/branches/zend@170 51a70ab9-7547-0410-9469-37e369ee0574
This commit is contained in:
svollbehr
2010-03-06 18:18:16 +00:00
parent 089c866bc2
commit ac369c2c8b

223
src/Zend/Bit/Twiddling.php Normal file
View File

@@ -0,0 +1,223 @@
<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Io
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id$
*/
/**
* A utility class to perform bit twiddling on integers.
*
* @category Zend
* @package Zend_Bit
* @author Ryan Butterfield <buttza@gmail.com>
* @author Sven Vollbehr <sven@vollbehr.eu>
* @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @version $Id$
* @static
*/
final class Zend_Bit_Twiddling
{
/**
* Default private constructor for a static class.
*/
private function __construct()
{
}
/**
* Sets a bit at a given position in an integer.
*
* @param integer $integer The value to manipulate.
* @param integer $position The position of the bit to set.
* @param boolean $on Whether to enable or clear the bit.
* @return integer
*/
public static function setBit($integer, $position, $on)
{
return $on ? self::enableBit($integer, $position) :
self::clearBit($integer, $position);
}
/**
* Enables a bit at a given position in an integer.
*
* @param integer $integer The value to manipulate.
* @param integer $position The position of the bit to enable.
* @return integer
*/
public static function enableBit($integer, $position)
{
return $integer | (1 << $position);
}
/**
* Clears a bit at a given position in an integer.
*
* @param integer $integer The value to manipulate.
* @param integer $position The position of the bit to clear.
* @return integer
*/
public static function clearBit($integer, $position)
{
return $integer & ~(1 << $position);
}
/**
* Toggles a bit at a given position in an integer.
*
* @param integer $integer The value to manipulate.
* @param integer $position The position of the bit to toggle.
* @return integer
*/
public static function toggleBit($integer, $position)
{
return $integer ^ (1 << $position);
}
/**
* Tests a bit at a given position in an integer.
*
* @param integer $integer The value to test.
* @param integer $position The position of the bit to test.
* @return boolean
*/
public static function testBit($integer, $position)
{
return ($integer & (1 << $position)) != 0;
}
/**
* Sets a given set of bits in an integer.
*
* @param integer $integer The value to manipulate.
* @param integer $bits The bits to set.
* @param boolean $on Whether to enable or clear the bits.
* @return integer
*/
public static function setBits($integer, $bits, $on)
{
return $on ? self::enableBits($integer, $bits) :
self::clearBits($integer, $bits);
}
/**
* Enables a given set of bits in an integer.
*
* @param integer $integer The value to manipulate.
* @param integer $bits The bits to enable.
* @return integer
*/
public static function enableBits($integer, $bits)
{
return $integer | $bits;
}
/**
* Clears a given set of bits in an integer.
*
* @param integer $integer The value to manipulate.
* @param integer $bits The bits to clear.
* @return integer
*/
public static function clearBits($integer, $bits)
{
return $integer & ~$bits;
}
/**
* Toggles a given set of bits in an integer.
*
* @param integer $integer The value to manipulate.
* @param integer $bits The bits to toggle.
* @return integer
*/
public static function toggleBits($integer, $bits)
{
return $integer ^ $bits;
}
/**
* Tests a given set of bits in an integer
* returning whether all bits are set.
*
* @param integer $integer The value to test.
* @param integer $bits The bits to test.
* @return boolean
*/
public static function testAllBits($integer, $bits)
{
return ($integer & $bits) == $bits;
}
/**
* Tests a given set of bits in an integer
* returning whether any bits are set.
*
* @param integer $integer The value to test.
* @param integer $bits The bits to test.
* @return boolean
*/
public static function testAnyBits($integer, $bits)
{
return ($integer & $bits) != 0;
}
/**
* Stores a value in a given range in an integer.
*
* @param integer $integer The value to store into.
* @param integer $start The position to store from. Must be <= $end.
* @param integer $end The position to store to. Must be >= $start.
* @param integer $value The value to store.
* @return integer
*/
public static function setValue($integer, $start, $end, $value)
{
return self::clearBits
($integer, self::getMask
($start, $end) << $start) | ($value << $start);
}
/**
* Retrieves a value from a given range in an integer, inclusive.
*
* @param integer $integer The value to read from.
* @param integer $start The position to read from. Must be <= $end.
* @param integer $end The position to read to. Must be >= $start.
* @return integer
*/
public static function getValue($integer, $start, $end)
{
return ($integer & self::getMask($start, $end)) >> $start;
}
/**
* Returns an integer with all bits set from start to end.
*
* @param integer $start The position to start setting bits from. Must
* be <= $end.
* @param integer $end The position to stop setting bits. Must
* be >= $start.
* @return integer
*/
public static function getMask($start, $end)
{
return ($tmp = (1 << $end)) + $tmp - (1 << $start);
}
}