位运算的简单简要

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

posted @ 2012-07-23 14:00  幻星宇  阅读(340)  评论(0编辑  收藏  举报