42 lines
		
	
	
		
			906 B
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			906 B
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
declare(strict_types = 1);
 | 
						|
 | 
						|
namespace BaconQrCode\Common;
 | 
						|
 | 
						|
/**
 | 
						|
 * General bit utilities.
 | 
						|
 *
 | 
						|
 * All utility methods are based on 32-bit integers and also work on 64-bit
 | 
						|
 * systems.
 | 
						|
 */
 | 
						|
final class BitUtils
 | 
						|
{
 | 
						|
    private function __construct()
 | 
						|
    {
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Performs an unsigned right shift.
 | 
						|
     *
 | 
						|
     * This is the same as the unsigned right shift operator ">>>" in other
 | 
						|
     * languages.
 | 
						|
     */
 | 
						|
    public static function unsignedRightShift(int $a, int $b) : int
 | 
						|
    {
 | 
						|
        return (
 | 
						|
            $a >= 0
 | 
						|
            ? $a >> $b
 | 
						|
            : (($a & 0x7fffffff) >> $b) | (0x40000000 >> ($b - 1))
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Gets the number of trailing zeros.
 | 
						|
     */
 | 
						|
    public static function numberOfTrailingZeros(int $i) : int
 | 
						|
    {
 | 
						|
        $lastPos = strrpos(str_pad(decbin($i), 32, '0', STR_PAD_LEFT), '1');
 | 
						|
        return $lastPos === false ? 32 : 31 - $lastPos;
 | 
						|
    }
 | 
						|
}
 |