首页 > 代码库 > 位运算学习笔记

位运算学习笔记

一、二进制

  1. 二进制的最高位是符号位:0表示正数,1表示负数
  2. 正数 的源码反码,补码,都一样
  3. 负数的反码=它的源码 符号 位不变,其它位取反(0->1,1->0)
  4. 负数的补码=它的反码+1
  5. 0的反码补码都是0
  6. php没有无符号数
  7. 在计算机 运算 的时候,都是以补码的方式来运算的

例:
-1 的源码 10000000 00000000 00000000 00000001
-1 的反码 11111111 11111111 11111111 11111110
-1 的补码 11111111 11111111 11111111 11111111

二、位运算

  1. 按位与& :两位全为1,结果为1
  2. 按位或| :两位有一个为1,结果为1
  3. 按位异或^:两位一个为0,1个为1,结果为1
  4. 按位取反~:0->1,1->0
  5. 右移>>:向右移动n次(除以2的n次方),低位溢出,并用符号位补溢出的高位,符号位不变
  6. 左移<<:向左移动n次(乘以2的n次方),低位补0,符号位不变

例&:
2&3=?
2的补码 00000000 00000000 00000000 00000010
3的补码 00000000 00000000 00000000 00000011
2&3的补码 00000000 00000000 00000000 00000010(补码)

例|:
2的补码 00000000 00000000 00000000 00000010
3的补码 00000000 00000000 00000000 00000011
2|3 00000000 00000000 00000000 00000011

例^:
2的补码 00000000 00000000 00000000 00000010
3的补码 00000000 00000000 00000000 00000011
2^3 00000000 00000000 00000000 00000001

例~:
~2=?
步骤:
1.首先求出2的补码,2是整数,所以 原码=反码=补码
00000000 00000000 00000000 00000010
2.取反后,为 ?的补码
11111111 11111111 11111111 11111101
3.?的补码-1,为 ?的反码
11111111 11111111 11111111 11111100
4.?的反码取反,为 ?的值
10000000 00000000 00000000 00000011 => -3

例>>:
1>>2=?
1的补码 00000000 00000000 00000000 00000001
右移2位 00(<补位)00000000 00000000 00000000 000000(截断)01

例>>:
-1>>2=?
-1的原码 10000000 00000000 00000000 00000001
-1的反码 11111111 11111111 11111111 11111110
-1的补码 11111111 11111111 11111111 11111111
右移2位 11111111 11111111 11111111 11111111(补码)
补码-1 11111111 11111111 11111111 11111110(反码)
取反码 10000000 00000000 00000000 00000001

例<<:
1<<2=?
1的补码 00000000 00000000 00000000 00000001
左移2位 00(截断)000000 00000000 00000000 00000001(补位>)00

例<<:
-1<<2=?
-1的原码 10000000 00000000 00000000 00000001
-1的反码 11111111 11111111 11111111 11111110
-1的补码 11111111 11111111 11111111 11111111
左移2位 11111111 11111111 11111111 11111100(补码)
补码-1 11111111 11111111 11111111 11111011(反码)
取反码 10000000 00000000 00000000 00000100

 

echo 6&3;//2
echo "<br>";
echo 6|3;//7
echo "<br>";
echo 6^3;//5
echo "<br>";
echo ~6;//-7
echo "<br>";
echo 6>>3;//0
echo "<br>";
echo 6<<3;//48
echo "<br>";

echo -6&3;//2
echo "<br>";
echo -6|3;//-5
echo "<br>";
echo -6^3;//-7
echo "<br>";
echo ~-6;//5
echo "<br>";
echo -6>>3;//-1
echo "<br>";
echo -6<<3;//48

 

位运算学习笔记