有一个数字 :(+,-)30.6789
现在要用4个字节 32位表示
用高位(1位)表示正负(1代表+ 0 代表-)
用10位表示 整数 30
用21位表示小数6789
我想要的结果为 4个16进制的数
//补位数 函数
string str_pad ( string , int pad_length , string pad_string , int pad_type);
string 指定字符串,pad_length指定长度,pad_string用来填充的字符串(可选参数),pad_type指定填充位置(可选参数,STR_PAD_LEFT,STR_PAD_BOTH);
如果pad_string , pad_type均为空,那么就等于默认pad_string 为空格, pad_type就是自动填充在指定字符串的末端.
//进制转换
1: 十进制转二进制 decbin() 例:echo decbin(12); //输出 1100
2:十进制转八进制 decoct() 例:echo decoct(15); //输出 17
3:十进制转十六进制 dechex() 例:echo dechex(10); //输出 a
4:二进制转十六制进 bin2hex() 例:echo bin2hex('A'); //字符对应的ascii 十进制 65 十六进制 41 返回 ASCII 字符串,为参数 str 的十六进制表示。转换使用字节方式,高四位字节优先
$binary = "11111001"; $hex = dechex(bindec($binary)); echo $hex;//输出f9
5:二进制转十制进 bindec() 例:echo bindec('110011'); //输出 51
6:八进制转十进制 octdec() 例:echo octdec('77'); //输出 63
7:十六进制转十进制 hexdec() 例: var_dump(hexdec("See")); var_dump(hexdec("ee")); // both print "int(238)"
8:任意进制转换 base_convert() 例:$hexadecimal = 'A37334'; echo base_convert($hexadecimal, 16, 2);//输出 101000110111001100110100
//PHP 位移运算符(<<左移和>>右移)
<< 位左移 ::左移运算的实质是将对应的数据的二进制值逐位左移若干位,并在空出的位置上填0,最高位溢出并舍弃
例:$a=10;
$b=$a<<2;
则$b=40,根据手册描述可以看出位运算可以看出向左移一位,则是实现乘2运算。由于位移操作的运算速度比乘法的 运算速度高很多。因此在处理数据的乘法运算的时,采用位移运算可以获得较快的速度。
**提示 将所有对2的乘法运算转换为位移运算,可提高程序的运行效率
>> 位右移 ::右移运算的实质是将对应的数据的二进制值逐位右移若干位,并舍弃出界的数字。如果当前的数为无符号数, 高位补零
例:$a = 25;//11001
b=a>>2;//等价于:11001 >> 01100, 01100 >> 00110.那么110 =》 6,即25/4 = 6
b=(0000 0000 0000 0110)=6
如果当前的数据为有符号数,在进行右移的时候,根据符号位决定左边补0还是补1。
如果符号位为0,则左 边补0;但是如果符号位为1,则根据不同的计算机系统,可能有不同的处理方式。
可以看出位右移运算,可以实现对除数为2的整除运算。
**提示 将所有对2的整除运算转换为位移运算,可提高程序的运行效率
// 高位 低位
???????????
//ord chr
string chr (int ascii); 该函数用于将ASCII码值转化为字符串
int ord(string str); 该函数用于将字符串转化为ASCII码值
例:
<?php
//使用chr()函数和ord()函数进行字符串与ASCII码之间的转换,程序代码如下:
$str1=chr(88);
echo $str1; //返回值为X
echo "\t";
$str2=ord('S');
echo $str2; //返回值为83
//运行结果:X 83
?>
答案::::
//根据经纬度 转换为 二进制
// 10位代表整数,21位代表小数 用高位(1位)表示正负(1代表+ 0 代表-)
public function LatLngToBin($latLng){
$latLngArr = explode('.',$latLng);
$int_bin = decbin($latLngArr[0]);
$int = str_pad($int_bin,10,'0',STR_PAD_LEFT);
$abc = str_pad($latLngArr[1],6,'0',STR_PAD_RIGHT);
$xs_bin = decbin($abc);
$xs = str_pad($xs_bin,21,'0',STR_PAD_LEFT);
$str = '1'.$int.$xs;
$arr = str_split($str,8);
$string = '';
for($i=3;$i>=0;$i--){
$string.= chr(bindec($arr[$i]));
}
return $string;
}
// 解析经纬度
$latRes = $this -> commonfun($str,4,4); //纬度 南纬1 北纬0
$lat = $latRes & 0x7FFFFFFF;
$new_lat = $lat >> 21;
$lat_xs = ($lat & (0x1fffff))/1000000;
$p_lat = $new_lat + $lat_xs;
/*
* shen
* 2017-5-18
* 为解析二进制数据服务的方法
* 参数:$str:需要解析的字符串 $skip:跳过的位数 $len:需要解析的位数
*/
public function commonfun($str,$skip,$len){
$result = 0;
for($i=0;$i<$len;$i++){
$result = (ord($str[$skip+$i]) << ($i << 3)) | ($result);
}
return $result;
}
/*
* 高效的取1方法
*
* 得到一个十进制数里有几个1
*/
function getBit1($n)
{
$n = ($n&0x55555555) + (($n>>1)&0x55555555);
$n = ($n&0x33333333) + (($n>>2)&0x33333333);
$n = ($n&0x0f0f0f0f) + (($n>>4)&0x0f0f0f0f);
$n = ($n&0x00ff00ff) + (($n>>8)&0x00ff00ff);
$n = ($n&0x0000ffff) + (($n>>16)&0x0000ffff);
return $n;
}