bit strings
| From: | Lluís Forns | Date: | Tue, 18 Dec 2001 12:19:22 +0000 |
| Subject: | bit strings | ||
| Groups: | php.smarty.dev | ||
| Request: | Send a blank email to php-smarty-dev+get-435@lists.php.net to get a copy of this message | ||
hello,
I need to work with long bit 'strings' in order to store data. I thougth of
using 'int' to save that, but int was to small, so I started using strings.
Now I have created some functions to generate, modify and search binary data
in strings, and they work good enough for me (after generating data, I store
it in a text field in mySQL); but I amb sure they can be better and faster,
so any comment is wellcome.
function bittest($cadena,$bit)
{
$resposta=0;
$caracter=intval($bit/8);
if ($caracter< strlen($cadena))
{
$caracter=substr($cadena,$caracter,1);
$caracter=ord($caracter);
$bit=round((($bit/8)-(intval($bit/8)))*8);
$caracter=decbin($caracter);
while (strlen($caracter)<8)
{ $caracter="0".$caracter; }
$resposta=substr($caracter,((8-1)-$bit),1);
}
return $resposta;
}
function bitlength($cadena)
{
if($cadena=="") return 0;
else {
$resposta=(strlen($cadena)-1)*8;
$final=substr($cadena,-1,1);
$resta=strlen(decbin(ord($final)));
return $resposta+$resta;
}
}
function bitset($cadena,$bit)
{
$and=round((($bit/8)-(intval($bit/8)))*8);
$and=chr(1 << $and);
$car_afe=(intval($bit/8));
while (strlen($cadena2)<$car_afe)
{ $cadena2=$cadena2.chr(0); }
$cadena2=$cadena2.$and;
$resposta=($cadena|$cadena2);
return $resposta;
}
function bitunset($cadena,$bit)
{
$and=round((($bit/8)-(intval($bit/8)))*8);
$and=~(chr((1 << $and)));
$car_afe=(intval($bit/8));
while (strlen($cadena2)<$car_afe)
{ $cadena2=$cadena2.(chr(bindec('11111111'))); }
$cadena2=$cadena2.$and;
$resposta=(($cadena2) & ($cadena));
$final=substr($cadena,(intval($bit/8)+1));
$resposta=$resposta.$final;
$resposta=rtrim($resposta);
return $resposta;
}