Add support for bit twiddling
git-svn-id: http://php-reader.googlecode.com/svn/trunk@110 51a70ab9-7547-0410-9469-37e369ee0574
This commit is contained in:
235
src/Twiddling.php
Normal file
235
src/Twiddling.php
Normal file
@@ -0,0 +1,235 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* PHP Reader Library
|
||||||
|
*
|
||||||
|
* Copyright (c) 2008 The PHP Reader Project Workgroup. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer.
|
||||||
|
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
* - Neither the name of the project workgroup nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from this
|
||||||
|
* software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @package php-reader
|
||||||
|
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
|
||||||
|
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A utility class to perform bit twiddling on integers.
|
||||||
|
*
|
||||||
|
* @package php-reader
|
||||||
|
* @author Ryan Butterfield <buttza@gmail.com>
|
||||||
|
* @copyright Copyright (c) 2008 The PHP Reader Project Workgroup
|
||||||
|
* @license http://code.google.com/p/php-reader/wiki/License New BSD License
|
||||||
|
* @version $Rev$
|
||||||
|
* @static
|
||||||
|
*/
|
||||||
|
final class 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)
|
||||||
|
{
|
||||||
|
$mask = 0;
|
||||||
|
for (; $start <= $end; $start++)
|
||||||
|
$mask |= 1 << $start;
|
||||||
|
return $mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user