zoukankan      html  css  js  c++  java
  • PHP 的 << 和 >> 位移运算符

    先举两个例子

    1 $b = 10;
    2 $b = $b << 3;
    3 echo $b; //输出 80
    $b = 10;
    $b = $b >> 3;
    echo $b; //输出 1

    可以发现  左位移会乘以相应的数   而 右位移会除以相应的数 如果得出浮点数,舍掉小数位,只取整数,位移运算其实是对二进制数的操作

    位移运算符

    << 位左移

    左移运算的实质是将对应的数据的二进制值逐位左移若干位,并在空出的位置上填0,最高位溢出并舍弃。例 如
    $a=10;
    $b=$a<<2;
    则$b=40,根据手册描述可以看出位运算可以看出向左移一位,则是实现乘2运算。由于位移操作的运算速度比乘法的 运算速度高很多。因此在处理数据的乘法运算的时,采用位移运算可以获得较快的速度。
    提示 将所有对2的乘法运算转换为位移运算,可提高程序的运行效率

    示例:
    以下三种表达方式是一个意思。
    $a = 1024;
    for($i=1; $i<$a; $i = $i+$i){
    echo $i.” ”;
    }

    $a = 1024;
    for($i=1; $i<$a; $i = 2*$i){
    echo $i.” ”;
    }

    $a = 1024;
    for($i=1; $i<$a; $i = $i<<1){
    echo $i.” ”;
    }

    >> 位右移
    右移运算的实质是将对应的数据的二进制值逐位右移若干位,并舍弃出界的数字。如果当前的数为无符号数, 高位补零。例如:
    $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的整除运算转换为位移运算,可提高程序的运行效率

    举例:输入一个整数,判断这个数中有几个二进制位1?例如输入67,输出结果应该为3。
    因为67的相应二进制数为00000000 01000011(0043H),有3个1出现。
    分析:要判断是不是1,只需要判断该位与1与以后是不是1就可以知道。一个整数,判断16次即可。
    main(){
      int num,k;
      int count=0;/* 记录1的个数 */
      scanf(%d,&num);
      for(k=0;k<16;k++){
        if(num&1==1) count++; /* 判断最低位是不是1 */
        num>>=1;/* num右移1位 */
      }
      printf(%d ,count);
    }

    这样每次都判断最低位是不是1,判断完以后,让前面的右移一位即可。

    转载自  http://www.cnblogs.com/lbnnbs/p/5883799.html

    既不回头,何必不忘; 既然无缘,何须誓言; 今日种种,逝水无痕; 明夕何夕,君已陌路;
  • 相关阅读:
    js angularjs 杂记
    myEclipse快捷键
    eclipse快捷键
    PL/SQL Developer 开发工具修改日期类型的值
    Tensor flow 实战Google深度学习框架 笔记摘要Pthree(二)
    Tensor flow 实战Google深度学习框架 笔记摘要Pthree
    Tensor flow 实战Google深度学习框架 笔记摘要Pfour(二)
    Tensor flow 实战Google深度学习框架 笔记摘要Pfour
    《神经网络与深度学习》讲义 邱锡鹏著 (仅数学基础部分)
    关于YOLO算法的备忘
  • 原文地址:https://www.cnblogs.com/zyjfire/p/7079546.html
Copyright © 2011-2022 走看看