给李书记点个赞吧
首页

php中的位运算符

今天讲的php的位运算符是一个难点,很多人搞得都很糊涂,其实就是我们上学时候讲的计算机原理吧,在php中很多东西都是通过这样的二进制运算存在的,而位运算符是针对整数类型的,通过运算实现功能,下面李书记会举一个列子说明:

基础规定:

1,位是什么?就是2进制数字的每一个“位”,一个整数数字,有(由)32个位构成!

2,位运算符是仅仅针对整数进行的运算符;

3,位运算符有如下几个

&: 按位与;

|: 按位或;

~: 按位非;按位取反;

^: 按位异或;

4,位运算符的基本语法规则:

按位与基本规则:

1  &  1  ==>>  1

1  &  0  ==>>  0

0  &  1  ==>>  0

0  &  0  ==>>  0

按位或基本规则:

1  |  1  ==>>  1

1  |  0  ==>>  1

0  |  1  ==>>  1

0  |  0  ==>>  0

按位非基本规则:

~1  ==>>  0

~0  ==>> 1

按位异或基本规则:

1  ^  1  ==>>  0

1  ^  0  ==>>  1

0  ^  1  ==>>  1

0  ^  0  ==>>  0

可见,按位异或的规则是:相同为0,不同为1

整数的按位与运算(&)

形式:

$n1  &  $n2; //n1,n2是2个任意整数;

含义:

将该2个整数的二进制数字形式(注意,都是32位)的每一个对应位上的数字进行基本按位与运算之后的结果!

注意:他们运算的结果,其实仍然是一个普通的数字(10进制)。

示例图示(只用8个位来演示):$r1 = 10 & 20;

10的2进制 0 0 0 0 1 0 1 0
20的2进制 0 0 0 1 0 1 0 0
&运算结果: 0 0 0 0 0 0 0 0

数据验证:

$v = 10 & 20;  echo "v1=$v";    v1 = 0;

整数的按位或运算:

形式:

$n1  |  $n2; //n1,n2是2个任意整数;

含义:

将该2个整数的二进制数字形式(注意,都是32位)的每一个对应位上的数字进行基本按位或运算之后的结果!

注意:他们运算的结果,其实仍然是一个普通的数字(10进制)。

示例图示(只用8个位来演示):$r1 = 10 | 20;

10的2进制 0 0 0 0 1 0 1 0
20的2进制 0 0 0 1 0 1 0 0
|运算结果: 0 0 0 1 1 1 1 0

数据验证:

$v = 10 | 20;  echo "v1=$v";    v1 = 30;

整数的按位左移运算

形式:

$n1  <<  $m

含义:

将十进制数字n1的二进制数字形式(也是32位的)的每一个位上的数字都一次性往左边移动m位,

并将右边空出来的位置补0,左边冒出去的不管,这样操作之后得到的结果。

示例图示(只用8个位来演示):$r1 = 10 <<  2;

10的2进制 0 0 0 0 1 0 1 0
左移2位后 0 0 1 0 1 0 0 0
则结果为: 25 0 23 0 0 0

可见,结果为:25  +  23  =  32 + 8  = 40

代码验证:$r1 = 10 <<  2;  echo "v1=$r1";   v1=40;

补充知识:原码,反码,补码

原码:

就是一个二进制数字,从“数学观念”上来表达出的形式。其中,我们规定:一个数字的最左边一位是“符号位”,0表示正数,1表示负数;比如:

原码

反码:

正数的反码就是其本身(即不变);负数的反码是:符号位不变,其他位取反;比如:

反码

补码:

正数的补码就是其本身(即不变);负数的补码是:符号位不变,其他位取反后+1——即反码+1

补码

一个小提示:计算机内部的运算,实际全都是使用补码进行的,而且运算的时候,符号位不再区分,直接也当做“数据”参与运算:

示例1:5+3:

数据运算

示例2: 5-3:实际上,cpu内部,会将“减法”运算,转换为“加法运算”,即:5 + (-3)

数据运算

位运算符的应用:管理一组事物的开关状态

什么是开关状态?

现实中,有很多数据都是只有2种结果(值)的,对应的其实就是我们的布尔类型的值。这里,所谓管理一组事物的开关状态,应该理解为其实就是管理若干个只有2个状态的“数据符号”。

比如:有5个灯泡,对应5个状态数据。这5个灯泡,就有 25  种状态呢?

这里的管理目标是:使用一个变量,就可以表达若干个数据的“当前状态”。具体有3个任务:

1,通过该变量,可以获知任何一个数据(灯泡)的当前状态。

2,通过该变量,可以将一个一个数据的状态“关闭”;

3,通过该变量,可以将一个一个数据的状态“开启”;

代码:

<?php
//假设,有5个灯泡需要管理,需要实现以下功能目标:
//1,  可以指定任意一个灯泡的“当前状态”
//2,  可以打开指定的任意一个灯泡
//3,  可以关闭指定的任意一个灯泡

//首先,需要设定对应的5个常量,代表对应的5个灯泡:
define("D1", 1);    //对应二进制值为:    00000001
define("D2", 2);    //对应二进制值为:    00000010
define("D3", 4);    //对应二进制值为:    00000100
define("D4", 8);    //对应二进制值为:    00001000
define("D5", 16);    //对应二进制值为:    00010000
//更多的灯,也按此规律定义常量值!!!

//然后,定义个变量,该变量就代表这5个灯泡的“任意组合状态”值;
$state = 10;    //其对应二进制值为:    00001010
                //此时,它其实表示第2和第4个灯亮
//$state = 7;    //其对应二进制值为:    00000111
//$state = 17;    //其对应二进制值为:    00010001
//注意:上述3个赋值,只是表示$state的值可以是“任意的”

//任务1,  可以指定任意一个灯泡的“当前状态”:
//需求1a:请输出灯泡1的状态;
if( $state & D1) > 0 ){//按此算法逻辑就可以判断灯1
//分析:
//$state的值为:    00001010
//D1的的值为:        00000001
//                  &
//----------------------------
//                    00000000
    echo "<br />灯1是亮的";
}
else{
    echo "<br />灯1是灭的";
}
//需求1b:请输出灯泡2的状态;
if( ($state & D2) > 0 ){//按此算法逻辑就可以判断灯2
    echo "<br />灯2是亮的";
}
else{
    echo "<br />灯2是灭的";
}

//做一个所有灯的整体显示:
function ShowAll(){
    echo "<p>";
    for($i = 1; $i <= 5; ++$i){
        $s = "D" . $i;
        if( ($GLOBALS['state'] & constant($s)) > 0 ){
            echo "灯{$i}亮,";
        }
        else{
            echo "灯{$i}灭,";
        }
    }
    echo "</p>";
}
echo "<br />初始所有灯的状态:";
showAll();

//需求2,  可以打开指定的任意一个灯泡
//也只要按照如下算法就可以打开:
//$state = $state | 对应灯的常量值;
//需求2a:请打开灯3:
$state = $state | D3;
echo "<br />灯3打开后:";
showAll();

//需求2b:请打开灯5:
$state = $state | D5;
echo "<br />灯5打开后:";
showAll();


//需求3,  可以关闭指定的任意一个灯泡
//也只要按照如下算法就可以打开:
//$state = $state & (~对应灯的常量值);
//需求3a:请关闭灯2:
$state = $state & (~D2);
echo "<br />灯2关闭后:";
showAll();
//需求3b:请关闭灯5:
$state = $state & (~D5);
echo "<br />灯5关闭后:";
showAll();

//需求3c:请关闭灯1(其实该灯本来就是关的):
$state = $state & (~D1);
echo "<br />灯1关闭后:";
showAll();
?>
  • 评论:2 条
  • 分类:学习php
  • 浏览:2041
  • 12月01日

    php的赋值运算符和赋值运算符

    今天我们一起开讲php的赋值运算符和赋值运算符以及php的条件(三目,三元)运算符等等,那么 因为这三个运算符比较的简单我们就一次性讲完了,下面请看以下内容:

    赋值运算符

    1,符号只有一个:. 也衍生出另一个: .=

    2,含义:就是将这个符号两边的字符串连接起来;

    3,如果两边不是字符串,就会自动转换为字符串,然后连接起来。

    “ab” . 3 ==>> “ab3”;

    “12” . 3 ==>>”123”

    12 . 3 ==>> “123”

    赋值运算符:

    一个基本赋值运算符: =

    形式: $变量名 = 值;

    理解: 将右边的值(不管做了多少运算),赋值给左边的变量。

    若干个衍生的赋值运算符:

    += 加等: 形式: $变量名 += 值;

    理解: 相当于: $变量名 = $变量名 + 值;

    -= 加等: 形式: $变量名 -= 值;

    理解: 相当于: $变量名 = $变量名 – 值;

    *= /= %= .= 其都可以认为是上述形式的一种简化版。

    条件(三目,三元)运算符

    只有一个,形式如下:

    数据值1 ? 数据值2 : 数据值3

      含义:

    对数据值1进行判断,如果为“真”,则该运算符的运算结果就是数据值2,否则就是数据值3;

    它是这样一个流程控制(逻辑判断)语句的简写形式:

    if( 数据值1 ){
    $变量名 = 数据值2;
    else{
    $变量名 = 数据值3;
    注意:如果数据值1不是布尔值,也会转换为布尔值;
    $score = 66; //分数
    $valuation = $score >= 60 ?  “及格”  :  “不及格”; //结果为“及格”
    $score = 56; //分数
    $valuation = $score >= 60 ?  “及格”  :  “不及格”; //结果为“不及格”
    $score = 56; //分数
    $valuation =  $score  ?  “及格”  :  “不及格”; //结果为“及格”,这里可能就偏离的本意!!
  • 评论:0条
  • 分类:学习php
  • 浏览:1280
  • 12月01日

    php中的逻辑运算符

    逻辑运算符都是针对“布尔值”进行的运算。如果不是布尔值,就会转换为布尔值进行;布尔值只有2个:true,false。

      基本运算规则(真值表):

      逻辑与规则:

    true && true ==>> true

    true && false ==>>false

    false && true ==>>false

    false && false ==>>false

    总结:只有2个都是true,结果才是true。只要有一个是false,结果就是false

      逻辑或规则:

    true || true ==>> true

    true || false ==>>true

    false || true ==>>true

    false || false ==>>false

    总结:只有2个都是false,结果才是false。只要有一个是true,结果就是true

      逻辑非规则:

    !true ==>> false

    !false ==>> true

    逻辑运算符的“短路现象”:

    <?php
    //此函数只是为了说明要对2个数据(x,y)进行
    //复杂的计算,然后返回计算结果
    function f1($x, $y){
        $m1 = $x*2;
        $m2 = $y*3;
        return $m1 + $m2;
    }
    $n1 = 3;
    $n2 = 4;
    //if判断语句写法1:
    if( $n1 > $n2  &&  f1($n1, $n2)  > 20 ) {
        //这里完成某种任务1
    }
    else{
        //这里完成另一些任务2
    }
    //if判断语句写法2:
    if( f1($n1, $n2)  > 20  &&  $n1 > $n2 ) {
        //这里完成某种任务1
    }
    else{
        //这里完成另一些任务2
    }
    //写法1和写法2,最终计算结果是一样的!
    //但写法1会具有优势:它有时候可能不需要进行“复杂”计算
    //就可以得到判断结果,这就是“短路”现象
    //而写法2却总是先去进行“复杂”计算,显然属于消耗资源行为
    //函数f1表示一个复杂的计算:
    $n1 = 3;
    $n2 = 2;
    //if判断语句写法1:
    if( $n1 > $n2  ||  f1($n1, $n2)  > 20 ) {
        //这里完成某种任务1
    }
    else{
        //这里完成另一些任务2
    }
    //if判断语句写法2:
    if( f1($n1, $n2)  > 20  ||  $n1 > $n2 ) {
        //这里完成某种任务1
    }
    else{
        //这里完成另一些任务2
    }
    //写法1和写法2,最终计算结果是一样的!
    //但写法1会具有优势:它有时候可能不需要进行“复杂”计算
    //就可以得到判断结果,这就是“短路”现象
    //而写法2却总是先去进行“复杂”计算,显然属于消耗资源行为

    结果:如果一个语句中,通过与运算需要进行多项判断,而且不同的判断具有明显不同的“复杂程度”,则我们应该将简单的判断放在前面,这时候我们就可以利用短路现象以达到提高效率的目的。

     

  • 评论:1 条
  • 分类:学习php
  • 浏览:1398
  • 11月30日

    php的比较运算符

    php的比较运算符我们要注意几点,一个就是怎么比较,数字和数字比较,字符串和字符串比较,数字和字符串比较,布尔值比较、纯数字字符串比较等等。

    比较运算符:

    符号:>、 >=、 <、 <=、 ==、 !=、===、 !==

    一般比较:是针对数字进行的大小比较

    不要对浮点数直接进行大小比较

    ==和===比较:前者通常叫做模糊相等的比较,后者叫做精确相等的比较(只有数据的类型和数据的值/内容,都相等,才是全等的)。必须能够找到手册的“类型比较表”:附录》php类型比较表:

    比较运算符比较运算符

    常见不同类型(标量类型)数据之间的比较规律:

    如果比较的数据中,有布尔值,转为布尔值比较,布尔值比较只有一个规则:true>false

    否则,如果有数字值,就转为数字值比较:这就是常规比较。

    否则,如果两边都是“纯数字字符串”,转为数字比较

    否则,就按字符串比较。字符串比较的规则是:

    对两边的字符串,一个一个从前往后取出字符并进行比较,谁“先大”,结果就是它大。

    举例:

    “abc” > true //? false
    “abc” > false //true
    “0” > false //false
    3 > “12”; //false
    3 > “12abc”; //false
    “3” > “12” //false
    “abc” > “c”; //false,后者大
    “abc” > “ab123cde”; //true 因为这里”c”大于”1”
    “3abc” > “12abc”; //true, 因为”3”大于“1”
    1 > “a”; //? true
    “1” > “a” //? false
    
    
    相关文档大家请参阅:
    php的比较运算符
    php运算符详解
    
    
  • 评论:0条
  • 分类:学习php
  • 浏览:735
  • 11月28日

    php运算符详解

    今天李书记讲php运算符,有关于运算符有很多,比如算术运算符、比较运算符、逻辑运算符、字符串运算符、赋值运算符、三目运算符、位运算符、数组运算符、等等,针对有这么多的运算符,李书记会一一讲解,让大家变得更加的清楚,清楚php编程中遇到的问题。

      算术运算符基础:

    符号有:+ – * / %

    说明:

    1,他们都是针对数字进行的运算;

    2,如果他们的两边有不是数字的数据,就会(自动)转换为数字;

    3,其中取余运算(取模运算)%,它只针对“整数”进行运算,如果不是,会自动截取为整数。

    11. 3 % 3 相当于 11 % 3;

    11.8 % 3. 8 相当于 11 % 3;

      自增自减运算符:

    常规:对数字进行自加1或自减1。

    字符串: 只能自增,且自增的效果就是“下一个字符”,其只能针对字母或数字进行自加:

    布尔值递增递减无效

    null递减无效,递增结果为1

    字符串自增的例子:

    自增自减运算符

      前自增和后自增的区别(自减类似)

    <?php
    $v1 = 1;
    $v2 = 1;
    $v1++;    //此行后,v1为2
    ++$v2;    //此行后,v2为2
    echo "<br />v1=$v1, v2=$v2";
    //说明:独立的加加运算中,前自增后自增效果一样!
    echo $v1++;    //输出2,此行后,v1为3
    echo "<br />";
    echo ++$v2;    //输出3,此行后,v2为3
    echo "<br />v1=$v1, v2=$v2";
    echo "<hr />";
    $s1 = $v1++;//s1为3,此行后,v1为4
    $s2 = ++$v2;//s2为4,此行后,v2为4
    echo "<br />s1=$s1, s2=$s2";
    echo "<br />v1=$v1, v2=$v2";
    //可见,在有加加运算的其他语句中,
    //前加加和后加加会有区别:
    //影响其他语句的执行结果:
    //前加加是先对自加变量加1,然后做其他运算
    //后加加是先做其他运算,然后对自加变量加1
    
    

    通常,我们在循环中,推荐使用前加加,比如:

    for($i = 1; $i < 10000; ++$i){ ……. }

    演示前加加后加加进行1千万次的“效率比较”:

    $t1 = microtime(true);    //获得当前时间,精确到万分之一秒
    for($i = 1; $i < 10000000; ++$i){
        
    }
    $t2 = microtime(true);    //获得当前时间,精确到万分之一秒
    for($i = 1; $i < 10000000; $i++){
        
    }
    $t3 = microtime(true);    //获得当前时间,精确到万分之一秒
    echo "<p>前加加耗时:" . ($t2-$t1);
    echo "<p>后加加耗时:" . ($t3-$t2);
  • 评论:0条
  • 分类:学习php
  • 浏览:793
  • 11月28日

    有关php布尔类型介绍

    有关于php布尔类型的介绍我们觉得是比较简单的,李书记在这里也就介绍一下,也就是说布尔类型的只有两个数据就是真(true)和假(false),单词是bool,boolean。

    布尔类型的一个常见应用情形是:对一个变量直接进行判断,比如if判断,示例如下:

    $v1 = 123;
    if($v2){    //这就是对一个变量直接进行判断的语法!
        echo "<br />可见{$v1}当做“真”!";
    }
    else{
        echo "<br />可见{$v1}当做“假”!";
    }

    这里的判断,永远是指:判断该变量(数据)“是否为真”。

    对于这种情况,只有如下数据是被当做“假”(false):

    0, 0.0, “”, “0”, null, array(), false, 还有一个是“未定义的变量”其余都是真。

    参考:手册》附录》PHP类型比较表》

    有关php布尔类型介绍

    类型转换自动转换:

    在任何运算中,如果需要某种类型的数据,而给出的数据不是该类型,通常都会发生自动转换:将该类型转换为目标需要的类型。

    比如: octdec($x), bindec($x), hexdec($x); //这里就要求$x必须是字符串,如果不是,就会转换;

    $v1 = 1 + “2”; //此时也发生了自动转换。代码如下:

    //这里演示的就是一些常见的自动转换
    $v1 = 1 + 2;    //3
    $v2 = 1 + "2";    //3;
    $v3 = "1" + 2;    //3
    $v4 = "1" + "2";    //3
    //在php中,算术运算符,就只是对数值进行计算
    $v5 = 1 + "2abc";    //3
    $v6 = "1" + "2abc";    //3
    $v7 = "1def" + "2abc";    //3
    $v7 = "1def" + "abc2";    //1
    $v7 = "def1" + "abc2";    //0
    //。。。。可见,这种识别字符串中数字的转换规则
    //是,只去“识别”字符串的前面数字部分
    $v8 = 1 + true;        //2;
    $v8 = 1 + false;        //1;
    //以上运算中,也适用于-, *,  /   %号!

    强制转换:

    自动类型转换是由“运算符”或类似运算符的语句来决定的。而:强制类型转换,仅仅是一个简单的语法:

    形式:(目标类型)数据;

    含义: 将该数据转换为设定的目标类型;

    例子:

    $v1 = 123;
    $s1 = (float) $v1;//将v1的值转换为float类型
                    //注意,此时$v1里面还是整数123
    $s2 = (string)$v1;//将v1的值转换为string类型
    echo "<br />s1为";  var_dump($s1);
    echo "<br />s2为";  var_dump($s2);

    通常的转换目标类型有:

    (int), (float), (string), (bool), (array), (object)

    上述强制类型转换,并不改变该变量的本身数据或类型。

    对应,有一个语法是直接改变改变本的数据(及类型):

    settype( $变量名, “目标类型”);

    $v2 = 123;
    setType($v2, "string");//直接转换v2的类型为string
    echo "<br />v2为";  var_dump($v2);

    类型相关的函数

    var_dump():用于输出变量的“完整信息”,几乎只用于调试代码。

    getType($变量名):获取该变量的类型名字,返回的是一个表示该类型名字的字符串,比如:“string”,“bool”,“double”,“int”

    setType($变量名,“目标类型”):将该变量强制改变为目标类型;

    isset(), empty(), unset();。。。。省略!

    is_XX类型() 系列函数:判断某个数据是否为某种类型,有如下一些:

    is_int($x); 判断$x是否是一个整数类型;

    is_float($x);

    is_string($x);

    is_bool($x);

    is_array($x);

    is_object($x);

    is_null($x);

    is_numeric($x); 判断$x是否是一个数字!

    is_scalar($x); 判断$x是否是一个“标量类型”。

    关于php布尔类型就介绍到这里,另外数据在李书记平台总结出几篇关于php相关数据类型的文章仅供大家参考学习:

    php中数据类型划分详解

    php中的浮点类型

    php中字符串详解

    有关php布尔类型介绍

  • 评论:3 条
  • 分类:学习php
  • 浏览:982
  • 11月25日

    php中的浮点类型

    php浮点类型属于php数据类型的基本类型,在形式中浮点数的表现形式有两种一种是常规的浮点数,另外一种是科学计数法,我们今天就对浮点数类型进行一个深入的研究吧。

    1, 常规写法:带小数点。

    $v1 = 123.456;

    2, 科学计数法:带一个特殊符号“E”

    $v1 = 123.456E2; //含义为:123.456乘以10的2次方;

    $v2 = 123.456E3; //含义为:123.456乘以10的3次方,虽然结果是123456,但仍然是“浮点型”

    $v3 = 123E4; //含义为:123乘以10的4次方,还是浮点数。

    浮点数使用的细节知识

    浮点数不应进行大小比较如下:

    $v1 = 8.1;    //浮点数
    if( $v1/3 == 2.7){
        echo $v1 . "/3 等于 2.7";
    }
    else{
        echo $v1 . "/3 不等于 2.7";
    }
    从上面代码可以看书浮点数进行比较是不相等的为什么呢?因为:

    1,所有数字,最终的表示形式,都是2进制!!!

    2,大多数浮点数的2进制形式,不能完全表达准确,最终只能“以很高的精度接近理论值”

    3,因此,浮点数比较是不可靠。

    那么我们在考虑考虑实际应用所需的精度的情况下,去将要比较的浮点数,转换为整数之后再比较。比如:

    要求精度为3为小数,则都乘以1000,然后取整后比较;

    要求精度为4为小数,则都乘以10000,然后取整后比较;

    if( round($v1 * 10000/3) == round(2.7 * 10000) ){
        echo $v1 . "/3 等于 2.7";
    }
    else{
        echo $v1 . "/3 不等于 2.7";
    }

    小数转二进制的做法:乘2并顺序取整数部分(了解):

    小数转二进制的做法乘2并顺序取整数部分

    当整数运算的结果超出整数的范围后,会自动转换为浮点数(了解)。

    获取一个数据(变量)的类型的函数有:

    getType($变量); 返回的是该类型的名字(字符串);

    var_dump($变量): 会输出该变量的类型,数据内容,(以及长度);

    $n1 = 10000;
    $s1 = $n1 * $n1;    //两个整数相乘
    $s2 = $n1 * $n1 * $n1;    //3个整数相乘
    echo "<br />整数的最大值为:" . PHP_INT_MAX;
    echo "<br />";  var_dump($s1);
    echo "<br />";  var_dump($s2);
    
    
  • 评论:0条
  • 分类:学习php
  • 浏览:833
  • 11月25日

    php中数据类型划分详解

    在php总体划分有8种数据类型,这八种类型分布分为基本类型(整数类型: int, integer、浮点数类型: float,double, real、字符串类型: string、布尔类型: bool, boolean 这种类型,只有2个数据:true,false)、复合类型( 数组: array、对象: object)、特殊类型(空类型: null 这种类型中,只有一个数据,那就是null、资源类型: resource)。那么针对这些类型李书记做相关介绍。

    整数类型

    在整数类型中有四种写法,请大家注意:

    $n1 = 123; //10进制数字写法
    $n2 = 0123; //8进制数字写法,实际n2中存储的数字比123小
    $n3 = 0x123; //16进制数字写法,实际n3中存储的数字比123大
    $n4 = 0b1010; //2进制数字写法(目前不学)
    
    $n1 = 123;        //10进制数字写法
    $n2 = 0123;        //8进制数字写法,实际n2中存储的数字比123小
    $n3 = 0x123;    //16进制数字写法,实际n3中存储的数字比123大
    echo "$n1, $n2, $n3";

    进制转换问题

    首先记住这几个单词:bin:2进制、oct:8进制、dec:10进制、hex:16进制

    进制转换主要分2种情况:

    1,10进制转换为其他3种进制:decbin(), decoct(), dechex();

    2,其他3种进制,转换为10进制:

    进制转换的系统函数、进制转换主要分2种情况:

    1,10进制转换为其他3中进制:

    decbin(一个10进制数字): 结果返回的是该数字的2进制数字形式的字符串!!!

    decoct(一个10进制数字): 结果返回的是该数字的8进制数字形式的字符串!!!

    dechex(一个10进制数字): 结果返回的是该数字的16进制数字形式的字符串!!!

    $n1 = 123;    //这是10进制的一个数字:
    $s1 = decbin($n1);    //将10进制转换为2进制
    $s2 = decoct($n1);    //将10进制转换为8进制
    $s3 = dechex($n1);    //将10进制转换为16进制
    echo "<br />$n1 的 2进制形式为:$s1";
    echo "<br />$n1 的 8进制形式为:$s2";
    echo "<br />$n1 的 16进制形式为:$s3";
    2,其他3种进制,转换为10进制:

    bindec(一个2进制数字字符串): 结果返回的是该2进制数字字符串对应的10进制数字!!!

    octdec(一个8进制数字字符串): 结果返回的是该8进制数字字符串对应的10进制数字!!!

    hexdec(一个16进制数字字符串): 结果返回的是该16进制数字字符串对应的10进制数字!!!

    对于输入的字符串中的字符,如果不是对应进制的数字,会被忽略。

    那么,有没有这个转换呢?hexbin()???? ——没有!

    $num2 = "1010110";
    $num8 = "123";        //注意,当做8进制数字
        //注意,这里,写的本质是一个”字符串“,不整数数字
        //所以,不需要加0,即无需写成"0123"
    $num16 = "123abc";    //注意,当做16进制数字
    $m1 = bindec($num2);    //将2进制字符串转换为10进制数字
    $m2 = octdec($num8);    //将8进制字符串转换为10进制数字
    $m3 = hexdec($num16);    //将16进制字符串转换为10进制数字
    echo "<br />2进制数字:$num2 的对应10进制值为:$m1";
    echo "<br />8进制数字:$num8 的对应10进制值为:$m2";
    echo "<br />16进制数字:$num16 的对应10进制值为:$m3";
    $m4 = 0x123abc;    //直接定义该16进制的数字!——其实内部的大小,然后是以10进制来衡量的!
    echo "<br />m4 = $m4" ;

    一个思考题:

    将8进制字符串”12345”,转换为2进制结果,怎么做?

    $v1 = octdec(“12345”); //此时,v1是10进制数字

    $result = decbin( $v1 ); //此时,就是结果:为2进制数字字符串!

    补充进制基础知识:

    10进制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    8进制 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21
    16进制 1 2 3 4 5 6 7 8 9 A B C D E F 10 11
    2进制 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000 10001
    20 21 22 23 24
    1 2 4 8 16

    一个课后题:

    $v1 = 0x123; //它的实际大小其实是:291
    $result = octdec( $v1 ); //结果为:17,怎么理解?推理如下:
    1,octdec( $v1 )
    2,octdec(291) //因为$v1的实际值就是291
    3,octdec(“291”); //因为octdec()函数要求输入一个字符串,这属于自动转换
    4,octdec(“21”); //因为octdec()函数要求输入一个8进制数字字符串,而9不是合法的数字,忽略掉
    5,结果,8进制数字”21”转换为10进制就是就是17;

    进制转换的人工计算——了解其原理

    10进制转换为2进制:

    做法:除2取余倒着写出所有余数,就是对应的2进制数字形式;

    详细解释:将一个10进制数字除以2,得到商和余数,如果商还大于等于2,则继续除以2,继续得到商和余数,以此类推,直到商为0为止,然后将前面的所有余数按倒序写出来就是对应的2进制数字。

    进制转换的人工计算

    10进制转换为8进制:

    做法:除8取余倒着写出所有余数,就是对应的8进制数字形式;

    详细解释:将一个10进制数字除以8,得到商和余数,如果商还大于等于8,则继续除以8,继续得到商和余数,以此类推,直到商为0为止,然后将前面的所有余数按倒序写出来就是对应的8进制数字。

    10进制转换为8进制

    10进制转换为16进制:

    做法:除16取余倒着写出所有余数,就是对应的16进制数字形式;

    详细解释:将一个10进制数字除以16,得到商和余数,如果商还大于等于16,则继续除以16,继续得到商和余数,以此类推,直到商为0为止,然后将前面的所有余数按倒序写出来就是对应的16进制数字。

    10进制转换为16进制

    其他进制转换为10进制的做法:

    先看一种对数字大小和“数字权值”的理解:

    对一个10进制数字: 1234,可以这样去理解它的大小:

    1234 = 1*103 + 2*102 + 3*101 + 4*100 = 1000 + 200 + 30 + 4; (任何数的0次方都是1)

    这里,我们对103 , 102, 101, 100 等等,称为“权值”;每个位的权值是不同的。

    对于10进制,每个位上的权值,就是10 的 n次方;

    对于8进制,每个位上的权值,就是8的 n次方;

    对于16进制,每个位上的权值,就是16 的 n次方;

    对于2进制,每个位上的权值,就是2 的 n次方;

    8进制转换10进制:

    将8进制数字的每个位上的数字乘以其对应位上的权值,然后相加之后的结果。

    举例:有一个8进制数字123,则其实际大小为:

    1 * 82 + 2 * 81 + 3 * 80 = 64 + 16 + 3 = 83;

    16进制转换10进制:

    将16进制数字的每个位上的数字乘以其对应位上的权值,然后相加之后的结果。

    举例:有一个16进制数字123,则其实际大小为:

    1 * 162 + 2 * 161 + 3 * 160 = 256 + 32 + 3 = 291;

    2进制转换10进制:

    将2进制数字的每个位上的数字乘以其对应位上的权值,然后相加之后的结果。

    举例:有一个2进制数字101011,则其实际大小为:

    1 * 25 + 0 * 24 + 1 * 23 + 0 * 22 + 1 * 21 + 1 * 20= 32 + 0 + 8 + 0 + 2 + 1 = 43;

  • 评论:0条
  • 分类:学习php
  • 浏览:735
  • 11月25日

    php中的常量

    常量是相对于变量来说的:是一个其中存储的数据不会也不应该改变的“标识符”。常量的使用,就2个方面:定义,取值。如果想链接php变量请参考:Php变量详解

    第6届中国SEO排行榜精彩演出

    常量的定义:

    <?php
    //常量定义语法1:
    //define("常量名",  常量值);
    define("PI",  3.14);    
    define("SCHOOL", "传智播客");
    //定义形式2:
    //const  常量名  = 常量值;
    const  CC1 = 1234;
    const  CC2 = 'abcd';

    常量的使用——取值:

    也有两种形式:直接使用名字,或通过constant()函数取得其值;

    //使用形式1:直接使用其名字
    echo "<br />常量PI的值是:" . PI;    //注意,不能写在引号中
    echo "<br />常量SCHOOL为:" . SCHOOL;
    $s1 = PI * 3 * 3;    //求半径为3的圆面积
    //使用形式2:使用函数constant()获得一个常量的值:
    //形式: constant("常量名");//注意:常量名是一个字符串
    $s2 = constant("PI") * 3 * 3;
    echo "<br />s1= $s1, s2 = $s2";
    echo "<br />" .  SCHOOL . constant("CC1") . constant("CC2");
    //取得常量值的灵活性语法:
    $i = 1;
    $c1 = "CC" . $i;
    echo "<br />常量 $c1 的值为:" . constant($c1);//输出1234

    常量变量的区别

    定义形式不同:

    使用形式不同:常量无需$符号

    可变程度不同:常量的值不可以改变,常量也不可以销毁

    作用范围不同:常量具有超全局作用域 (函数内外都可以直接使用)

    可用类型不同:常量只能存储标量类型(整数,浮点数,字符串,布尔)

    判断常量是否存在

    使用defined()函数:

    如果存在:返回结果是true,

    如果不存在:返回结果是false

    if( defined("PI") ){
        echo "<br />常量PI已经存在";    //通常此时就可以去使用它!
    }
    else{
        echo "<br />常量PI不存在";//通常,判断不存在,是为了来定义它!
        define("PI", 3.14);    //然后去使用
    }
    $s3 = PI * 5 * 5;
    echo "<br />面积为:$s3";
    
    if( defined("G") ){
        echo "<br />常量G已经存在";    //通常此时就可以去使用它!
    }
    else{
        echo "<br />常量G不存在";//通常,判断不存在,是为了来定义它!
        define("G", 9.8);    //然后去使用,G是”重力加速度"
    }
    $s4 = G * 6 ;    //6为时间(秒),这里是计算得到速度
    echo "<br />速度为:$s4";

    使用一个未定义的常量:

    先看2个对比代码:

    echo “v1的值为” . $v1; //注意,该变量v1未定义过

    echo “C1的值为” . C1; //注意,该常量C1未定义过

    注意:在php中,当使用一个未定义的常量的时候,系统会直接将该常量当做“有值”的常量去使用,并且其值就是该常量名——虽然也会报错!

    echo "<hr />";
    echo  "v1的值为"  .  $v1;        //注意,该变量v1未定义过
    echo  "C1的值为"  .  C1;        //注意,该常量C1未定义过

    预定义常量

    就是系统中预先定义好的一些常量,大约有几百个,我们只要知道几个就行:

    M_PI: 就是圆周率的常量值;

    PHP_OS: 就是php运行所在的操作系统

    PHP_VERSION:就是php的版本号

    PHP_INT_MAX: php中的最大的整数值

    ……更多可参考:php手册>附录>保留字列表>预定义常量

    魔术常量

    其实只是常量的形式,但没有常量的“恒常”的含义:其值其实会变化的,只有很少的几个:

    __FILE__ :代表当前网页文件的完整物理路径

    __DIR__ :代表当前网页文件所在的文件夹

    __LINE__ :代表当前这个常量名所在的”行号”

    echo "<br />" .  __FILE__;
    echo "<br />" .  __DIR__;
    echo "<br />" .  __LINE__;
    echo "<br />" .  __LINE__;
    echo "<br />" .  __LINE__;
  • 评论:0条
  • 分类:学习php
  • 浏览:1004
  • 11月25日

    php预定义变量

    在昨天我们讲到了Php变量详解,那么今天我们开始讲php的预定义变量,那么今天大家学习的就比较多了,我会加入比较通俗易懂的也是比较经典的案例方便phper新手的理解和掌握基本上看文档就可以学会php,相信很多人看视频太浪费时间了吧。

    所谓预定义变量,其实指,php这个语言工具中,预先就定义好的变量;我们只是“拿来使用”。

    综述

    主要有:$_GET, $_POST, $_REQUEST, $_SERVER, $GLOBALS,并且均是数组。
    1:系统定义与维护——即我们不应该其给其赋值或销毁其值,只应该去“用其值”。
    2:具有超全局作用域——哪里都可以使用。
    3:不同情形下可能具有不同的值

    $_POST变量

    含义:它代表用户通过表单以post方式( method=”post” )提交的时候所提交的所有数据——这个称为post数据。

    基本演示:post.html   文件

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <meta charset="utf-8">
    </head>
    <body>
        <form action="request.php" method="post">
        数据1:<input type="text" name="data1">
        数据2:<input type="text" name="data2"><br/>
        <input type="submit" value="提交">
        </form>
    </body>
    </html>

    基本演示:post.php   文件[接收数据]

    <?php
     $data1 = $_POST['data1'];
     $data2 = $_POST['data2'];
     echo "data1 = $data1,data2 = $data2";
     echo "<hr/>";
     print_r($_POST);
     ?>
     输出结果:
    data1 = 李海洋,data2 = 李海洋

    Array ( [data1] => 李海洋 [data2] => 李海洋 ) 
    
    empty(变量)和empty(变量)的区别:
    isset(变量):判断变量是否存在,或变量是否为空(null);如果存在,就是true,否则就是false
    empty(变量): 判断变量的“内容”是否为空的(不是null的空,而是没有内容),基本上,是一些硬性规定,如下数据都是“空的”: 0, “”, “0”, false, null, array()空数组也是空
    如果一个变量内容是空的,empty()返回的结果是true,否则是false

    $_GET变量

    含义:它代表用户通过get方式( 有5种get形式 )提交的时候所提交的所有数据——这个称为get数据。

    小提示:get,post没有翻译!

    提交get数据有5种形式:

    形式1:

    <form  action="目标文件.php" method="get">
        <input type="text"  name="data1" />
        <input type="text"  name="data2" />
        <input type="submit" value="提交" />
    </form>

    这种形式的get数据,跟post数据类似,数据内容由用户填写或选择而得到!

    形式2:

    <a   href=”目标文件.php?data1=5&data2=cctv&age=18”>链接文字</a>

    说明:

    1,它只是一个链接而已,只是在链接文件名的后面加上“?”,然后一个一个“串接数据”;

    2,数据形式为:数据项名称=数据值, 相互之间用“&”符号隔开

    3,这种形式的数据也同样是“点击链接”就提交的get数据,但用户只能选择点还是不点,而不能修改数据。

    形式3:

    <script>
        location.href = “目标文件.php?data1=5&data2=cctv&age=18”;
    </script>

    说明:

    1,该语句可以看做是通过js技术a标实现的页面跳转功能,跟签的连接功能完全一样!

    2,其中该语句,通常都是放在一个函数中,然后因为某个事件发生而去调用该函数!

    形式4:

    <script>
        location.assign( “目标文件.php?data1=5&data2=cctv&age=18”);
    </script>

    说明:

    该语句其实跟形式3完全一样功能,只是location这个对象实现页面跳转的另一个语法形式而已!

    形式5:php的跳转语法

    <?php
        //语法形式: header(“location: 目标网页地址”);
        header(“location: 目标文件.php?data1=5&data2=cctv&age=18”);
    ?>

    小结:

    上述多种get形式提交数据,都要理解为:

    跳转到某个页面,并“同时”携带(提交)一定的get数据过去!

    不管哪种形式的get数据提交,接收get数据,都只有一种形式,跟post类似:

    $v1 = $_GET[‘数据项名称’]; //取得一个get数据项的值;比如$_GET[‘data1’], $_GET[“age”];

    也可以“输出”所有get数据:

    print_r($_GET); 或 var_dump($_GET);

    $_REQUEST变量

    含义:一句话,它是$_GET变量和$_POST变量数据的“合集”:即,它里面同时存储了这两种数据。

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <meta charset="utf-8">
    </head>
    <body>
        <form action="request.php" method="post">
        数据1:<input type="text" name="data1">
        数据2:<input type="text" name="data2"><br/>
        <input type="submit" value="提交">
        </form>
    </body>
    </html>
    php代码:
    <?php 
        header("content-type:text/html;charset=utf-8");
        if(!empty($_POST)){
            echo "<p>post数据:<br/>";
            print_r($_POST);
        }
        if(!empty($_GET)){
            echo "<p>get数据:<br/>";
            print_r($_GET);
    
        }
        if(!empty($_REQUEST)){
            echo "<p>REQUEST数据:<br/>";
            print_r($_REQUEST);
        }
     ?>
    结果为:
    data1 = 李海洋,data2 = 李海洋

    Array ( [data1] => 李海洋 [data2] => 李海洋 )

    如果表单为get提交方式:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <meta charset="utf-8">
    </head>
    <body>
        <form action="request.php" method="get">
        数据1:<input type="text" name="data1">
        数据2:<input type="text" name="data2"><br/>
        <input type="submit" value="提交">
        </form>
    </body>
    </html>
    php代码为:
    <?php 
        header("content-type:text/html;charset=utf-8");
        if(!empty($_POST)){
            echo "<p>post数据:<br/>";
            print_r($_POST);
        }
        if(!empty($_GET)){
            echo "<p>get数据:<br/>";
            print_r($_GET);
    
        }
        if(!empty($_REQUEST)){
            echo "<p>REQUEST数据:<br/>";
            print_r($_REQUEST);
        }
     ?>

    结果为:

    get数据:
    Array ( [data1] => 李海洋 [data2] => 李海洋 )
    REQUEST数据:
    Array ( [data1] => 李海洋 [data2] => 李海洋 )

    怎么能同时具有get和post数据呢?

    只有一个方式:<!–以下action中的?号后面的数据都会以get方式提交–>

    <form   action=”目标文件.php?data1=5&data2=cctv&age=18”   method=”post”>
        <!--以下表单项的数据都会以post方式提交-->
        <input type=”text”  name=”n1” />
        <input type=”text”  name=”n1” />
        <input  type=”submit”  value=”提交” />
    </form>
    案例:html代码
    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <meta charset="utf-8">
    </head>
    <body>
        <form action="request.php?d1=5&d2=cctv&age=18" method="post">
        数据1:<input type="text" name="data1">
        数据2:<input type="text" name="data2"><br/>
        <input type="submit" value="提交">
        </form>
    </body>
    </html>
    案例:php代码
    <?php 
        header("content-type:text/html;charset=utf-8");
        if(!empty($_POST)){
            echo "<p>post数据:<br/>";
            print_r($_POST);
        }
        if(!empty($_GET)){
            echo "<p>get数据:<br/>";
            print_r($_GET);
    
        }
        if(!empty($_REQUEST)){
            echo "<p>REQUEST数据:<br/>";
            print_r($_REQUEST);
        }
     ?>
    实现结果:
    post数据:
    Array ( [data1] => 李海洋 [data2] => 李海洋 )
    get数据:
    Array ( [d1] => 5 [d2] => cctv [age] => 18 )
    REQUEST数据:
    Array ( [d1] => 5 [d2] => cctv [age] => 18 [data1] => 李海洋 [data2] => 李海洋 )

    request数据取值时,跟get数据和post也完全一样!

    $_REQUEST[‘数据项名称’];

    <?php 
        header("content-type:text/html;charset=utf-8");
        echo "<br/>".$_REQUEST['d1'];
        echo "<br/>".$_REQUEST['d2'];
        echo "<br/>".$_REQUEST['age'];
        echo "<br/>".$_REQUEST['data1'];
        echo "<br/>".$_REQUEST['data2'];
     ?>

    当post数据和get数据的数据项名称相同时(其实我们反对这么做),默认是post数据覆盖了get数据。

    不过这个状况同样可以在php.ini中设置:

    默认时:request_order = "GP";
    修改为:request_order = "PG";

    $_SERVER变量含义:

    它代表在一次浏览网页的过程中的浏览器端的一些信息或服务器端的一些信息。我们只是在程序中可以拿到这些信息,并用于编程所需!比如:取得用户的访问IP地址。

    注意:

    这种信息,随着不同的页面,和不同的服务器,以及不同的时刻,都可能不同!

    要求:

    大约有30个左右的信息,我们只要知道其中5个左右!主要有:

    $_SERVER[‘REMOTE_ADDR’]:获取访问者的ip地址

    $_SERVER[‘SERVER_ADDR’]:获取服务器所在的ip地址

    $_SERVER[‘SERVER_NAME’]:获取服务器的名字,其实就是站点设置中的servername

    $_SERVER[‘DOCUMENT_ROOT’]:获取站点的真实物理地址,其实就是站点设置中的documentroot

    $_SERVER[‘PHP_SELF’]:获取当前网页地址(不含域名部分)

    $_SERVER[‘SCRIPT_FILENAME’]:获取当前网页地址物理路径

    $_SERVER[‘QUERY_STRING’]获取当前网页地址中的所有get数据(就是?号后面部分),但只是一个整体的字符串而已。

    <?php 
        echo "<pre>";
        print_r($_SERVER);
        echo "</pre>";
        echo "<table border='1'>";
        foreach ($_SERVER as $key => $value) {
            echo "<tr>";
            echo "<td>$key</td>";
            echo "<td>$value</td>";
            echo "</tr>";
        }
        echo "</table>";
     ?>

    $GLOBALS变量

    含义:它也是一个“重复性数据”,它里面存储了我们自己定义的所有“全局变量”。

    举例:

    $v1 = 1; //定义了一个全局变量,

    此时,就有了这样一个数据:$GLOBALS[‘v1’],其值就是1

    echo $v1 ; //输出1

    echo $GLOBALS[‘v1’]; //输出1

    这个变量,主要是用于在局部范围不可以使用全局变量的时候,又需要该全局变量的值,此时就可以用它来取得该全局变量的值。

    <?php 
        $v1 = 1;
        echo "<pre>";
        print_r($GLOBALS);
        echo "</pre>";
     ?>
  • 评论:4 条
  • 分类:学习php
  • 浏览:1236
  • 11月23日