zoukankan      html  css  js  c++  java
  • 位运算的简单简要

    3:位运算符:

      位运算符允许对整型数中指定的位进行置位。如果左右参数都是字符串,则位运算符将操作这个字符串中的字符。

      &:$a & $b And(按位与) 将在 $a 和 $b 中都为 1 的位设为 1。

      |:$a | $b Or(按位或) 将在 $a 或者 $b 中为 1 的位设为 1。

      ^:$a ^ $b Xor(按位异或) 将在 $a 和 $b 中不同的位设为 1。

      ~:~ $a Not(按位非) 将 $a 中为 0 的位设为 1,反之亦然。

      <<:$a << $b Shift left(左移) 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。

      $a >> $b Shift right(右移) 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

      位运算符号涉及到微观的位变化,举个例子 5&3 那么5的存储二进制代码是 0110 3的存储二进制代码是0100 那么5与3做逻辑与预算即为

      0101

      0011

      0001 (结果为1)

      那么结果还是1,例子如下:

    双击代码全选
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <html>
     <head>
     <title>php常量定义--阿涛随笔</title>
     </head>
     <body>
      
    <?php
      
     $a=5;
     $b=3;
      
     $c=$a&$b;
      
     echo $c."<br>";
     echo 5&3;
      
    ?>
      
     </body>
      
    </html>

      为运算需要二进制方面的知识,一般用不到位运算。

    下面是些简单应用举例

    (1) 判断int型变量a是奇数还是偶数

    a&1 = 0 偶数

    a&1 = 1 奇数

    (2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1

    (3) 将int型变量a的第k位清0,即a=a&~(1<

    <>

    (4) 将int型变量a的第k位置1, 即a=a|(1<

    <>

    (5) int型变量循环左移k次,即a=a<>16-k (设sizeof(int)=16)

    (6) int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16)

    (7)整数的平均值

    对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:

    int average(int x, int y) //返回X,Y 的平均值

    {

    return (x&y)+((x^y)>>1);

    }

    (8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂

    boolean power2(int x)

    {

    return ((x&(x-1))==0)&&(x!=0);

    }

    (9)不用temp交换两个整数

    void swap(int x , int y)

    {

    x ^= y;

    y ^= x;

    x ^= y;

    }

    (10)计算绝对值

    int abs( int x )

    {

    int y ;

    y = x >> 31 ;

    return (x^y)-y ; //or: (x+y)^y

    }

    (11)取模运算转化成位运算 (在不产生溢出的情况下)

    a % (2^n) 等价于 a & (2^n – 1)

    (12)乘法运算转化成位运算 (在不产生溢出的情况下)

    a * (2^n) 等价于 a<< n

    (13)除法运算转化成位运算 (在不产生溢出的情况下)

    a / (2^n) 等价于 a>> n

    例: 12/8 == 12>>3

    (14) a % 2 等价于 a & 1

    (15) if (x == a) x= b;

       else x= a;

       等价于 x= a ^ b ^ x;

    (16) x 的 相反数 表示为 (~x+1)

    在32位系统上不要右移超过32位,不要在结果可能超过 32 位的情况下左移

  • 相关阅读:
    1新随笔
    MySQL--DML语言
    记一下Spring整合MyBatis踩的坑
    MyBatis(二)动态sql
    Mybatis动态代理注意事项
    几个练习指法和盲打的网站
    友链
    博客初心&心情小计
    博客园美化之标题显示
    博客园美化鼠标点击效果【富强民主文明和谐……】
  • 原文地址:https://www.cnblogs.com/xingmeng/p/2604860.html
Copyright © 2011-2022 走看看