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 位的情况下左移

  • 相关阅读:
    HDU 1800 Flying to the Mars 字典树,STL中的map ,哈希树
    字典树 HDU 1075 What Are You Talking About
    字典树 HDU 1251 统计难题
    最小生成树prim算法 POJ2031
    POJ 1287 Networking 最小生成树
    次小生成树 POJ 2728
    最短路N题Tram SPFA
    poj2236 并查集
    POJ 1611并查集
    Number Sequence
  • 原文地址:https://www.cnblogs.com/xingmeng/p/2604860.html
Copyright © 2011-2022 走看看