<?php
/**
* 根据十进制整数得到置为1的二进制位
*/
function get_bit_set_pos($int)
{
$str = strval(decbin($int));
$str = strrev($str);
$arr = array();
for ($i=0; $i<strlen($str); $i++) {
if ($str{$i}) {
$arr[] = $i+1;
}
}
return $arr;
}
/**
* 设置整数中指定的bit位
*/
function set_bit_pos($int, $pos)
{
if ($int>=0 && $pos>0) {
$set_pos_arr = get_bit_set_pos($int);
if ($set_pos_arr && array_search($pos, $set_pos_arr) !== false) {
return $int;
}
$int += pow(2, $pos-1);
return $int;
} else {
return $int; //false
}
}
/**
* 设置整数中指定的多个bit位(数组形式提供)
*/
function set_bit_pos_merge($int, $pos_arr)
{
if ($int<0 || !is_array($pos_arr) || !$pos_arr) {
return $int; //false
}
foreach ($pos_arr as $pos) {
if ($pos > 0) {
$int = set_bit_pos($int, $pos);
}
}
return $int;
}
/**
* 清除整数中指定的bit位
*/
function clean_bit_pos($int, $pos)
{
if ($int>0 && $pos>0) {
$set_pos_arr = get_bit_set_pos($int);
if (!$set_pos_arr || array_search($pos, $set_pos_arr) === false) {
return $int; //false
}
$int -= pow(2, $pos-1);
return $int;
} else {
return $int; //false
}
}
/**
* 清除整数中指定的多个bit位(数组形式提供)
*/
function clean_bit_pos_merge($int, $pos_arr)
{
if ($int<0 || !is_array($pos_arr) || !$pos_arr) {
return $int; //false
}
foreach ($pos_arr as $pos) {
if ($pos > 0) {
if (($ret = clean_bit_pos($int, $pos)) !== false) {
$int = $ret;
}
}
}
return $int;
}
|