/*
PHP中的位运算与位移运算
=======================
二进制Binary:0,1
逢二进1,易于电子信号的传输
原码、反码、补码
二进制最高位是符号位:0为正数,1为负数(左边是高位) 原码:二进制表示的数为原码
对于正数:原码反码补码都一样
1 ----> 0000000 00000000 00000000 00000001
对于负数:
反码:原码的符号位不变,其它位取反
补码:对负数的反码+1
-1原码: ---> 10000000 00000000 00000000 00000001
-1反码: ---> 11111111 11111111 11111111 11111110
-1补码: ---> 11111111 11111111 11111111 11111111
(0的反码补码都是0) PHP中的数据类型都是有符号的
计算机运算的时候,都是以补码的方式来运算的
(不写是正数还是负数,都会被转成补码,然后进行运算) PHP4个位运算符:(所有语言通用)
按位与& 两位全为1,则结果为1
按位或| 两位有1,则结果为1
按位异或^ 两位一个为0,一个为1,结果为1
按位取反~ 0变1,1变0 PHP中的移位运算符:
算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
算术左移<<:符号位不变,低位补0 */
echo "<h4>PHP位运算</h4>";
$n1=~2;
echo "$n1"."<br/>";// -3
/*
对2取反推导:
2的原码=反码=补码:
00000000 00000000 00000000 00000010
取反得补码:(计算机是以补码的方式来运算的)
11111111 11111111 11111111 11111101
得最高位为1,则是一个负数的补码,由补码推原码:减1,取反得原码
10000000 00000000 00000000 00000011
二进制原码转十进制,结果为:-3
*/ $n2=~-5;
echo "$n2"."<br/>";//
/*
对-5取反推导:
-5的符号位是1
获取其原码:
10000000 00000000 00000000 00000101
获取反码:(符号位不变,其它位取反)
11111111 11111111 11111111 11111010
获取补码:(反码加1)
11111111 11111111 11111111 11111011
对补码取反:(符号位是0为正数,正数的原码=反码=补码)
00000000 00000000 00000000 00000100
得正数:4
*/ $n3=2&3;
echo "$n3"."<br/>";//
/*
推导:
按位与& :两位全为1,则为1
获取2和3的补码(因为是正数:原码=反码=补码)
2 00000000 00000000 00000000 00000010
3 00000000 00000000 00000000 00000011
按位与:
2&3:00000000 00000000 00000000 00000010
获得结果为正数补码:2
*/ $n4=2|3;
echo "$n4"."<br/>";//
/*
推导:
按位或|:两位有1,则为1
获取2和3的补码(因为是正数:原码=反码=补码)
2 00000000 00000000 00000000 00000010
3 00000000 00000000 00000000 00000011
按位或:
2&3:00000000 00000000 00000000 00000011
获得结果为正数补码:3
*/ $n5=2^3;
echo "$n5"."<br/>";//
/*
推导:
按位异或^:两位不同则为1,否则为0
获取2和3的补码(因为是正数:原码=反码=补码)
2 00000000 00000000 00000000 00000010
3 00000000 00000000 00000000 00000011
按位或:
2&3:00000000 00000000 00000000 00000001
获得结果为正数补码:1
*/ $n6=-3^3;
echo "$n6"."<br/>";//
/*
推导:
获取-3的补码:
-3原码:10000000 00000000 00000000 00000011
-3反码:11111111 11111111 11111111 11111100 -3补码:11111111 11111111 11111111 11111101
获取3的补码:
3 补码:00000000 00000000 00000000 00000011 按位异或:
-3^3 11111111 11111111 11111111 11111110
因为结果是负数的补码,则需要获取其原码:
反码 11111111 11111111 11111111 11111101 原码 10000000 00000000 00000000 00000010
得结果为:-2
*/ echo "<h4>PHP位移运算</h4>";
// 算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
// 算术左移<<:符号位不变,低位补0 $a1= 1>>2;
echo "a1=.$a1"."<br/>";//
/*
推导:
算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
1的二进制向右移动两位,用符号位0补高位的两个空缺
00000000 00000000 00000000 00000001
1>>2:
00000000 00000000 00000000 00000000
结果:0
*/ $b1=-1>>2;
echo "b1=.$b1"."<br/>";//-1
/*
推导:
算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
-1的的补码:
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
-1>>2:相当于
11111111 11111111 11111111 11111111
得结果补码再取原码为:-1
*/ $c1=1<<2;
echo "c1=.$c1"."<br/>";// /*
推导:
算术左移<<:符号位不变,低位补0
1的补码:00000000 00000000 00000000 00000001
1<<2: 左移两位,低位补0 (相当于1*2*2)
00000000 00000000 00000000 00000100
得结果补码再取原码为:4
*/ $d1=-1<<2;
echo "d1=.$d1"."<br/>";//-4
// (相当于-1*2*2) 结果为:-4
// 推导:
// 算术左移<<:符号位不变,低位补0
// -1的补码:11111111 11111111 11111111 11111111
// -1<<2: 左移两位,低位补0
// 得结果
// 补码 11111111 11111111 11111111 11111100
// 反码 11111111 11111111 11111111 11111011
// 原码 10000000 00000000 00000000 00000100
// 结果:-4 ?>

PHP中的位运算与位移运算(其它语言通用)的更多相关文章

  1. Java中的位运算符、移位运算

    一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&)  :两位全为1,结果为1,否则为0: (2)按位或  (|)   :两位有一个为1,结果为1,否则为0: (3) ...

  2. Java学习日记基础篇(八) —— 二进制、位运算、位移运算

    二进制 二进制是逢2进位的进位置,0,1是基本算符 原码反码补码 在基本数据类型那里,有详细解释 二进制的最高位数是符号位:0表示整数,1表示负数 正数的原码,反码,补码都一样 负数的反码 = 它的原 ...

  3. C语言中的位运算的技巧

    一.位运算实例 1.用一个表达式,判断一个数X是否是2的N次方(2,4,8,16.....),不可用循环语句. X:2,4,8,16转化成二进制是10,100,1000,10000.如果减1则变成01 ...

  4. Google Earth Engine 中的位运算

    Google Earth Engine中的位运算 按位运算是编程中一个难点,同时也是在我们后续处理影像数据,尤其要使用影像自带的波段比如QA波段经常会用到的一个东西.通过按位运算我们可以筛选出我们想要 ...

  5. js中的位运算

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...

  6. C语言中的位运算和逻辑运算

    这篇文章来自:http://blog.csdn.net/qp120291570/article/details/8708286 位运算 C语言中的位运算包括与(&),或(|),亦或(^),非( ...

  7. 1<<30 hashMap 中使用位移运算的意义

    static final int MAXIMUM_CAPACITY = 1 << 30; 计算过程已1<<30为例,首先把1转为二进制数字 0000 0000 0000 000 ...

  8. C/C++中的位运算

    位运算     位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有:     &(按位与).|(按位或) ...

  9. PHP:第一章——PHP中的位运算

    //位运算: /*$a & $b;//And(按位与).$a和$b都为1的被设为1: $a | $b;//(按位或).$a和$b任何一个为1的位被设为1 $a ^ $b;//Xor(按位异或) ...

随机推荐

  1. Google Guava vs Apache Commons for Argument Validation

    It is an established good practice to validate method arguments at the beginning of the method body. ...

  2. [Android]ADB Server didn't ACK错误的解决方法

    Eclipse中调试的时候报错 [2014-06-18 13:07:49 - DinnerBooker] The connection to adb is down, and a severe err ...

  3. python print输出unicode字符

    命令行提示符下,python print输出unicode字符时出现以下 UnicodeEncodeError: 'gbk' codec can't encode character '\u30fb ...

  4. TcpClient类与TcpListener类

    TcpClient类 //构造方法1 TcpClient t = new TcpClient(); t.Connect(); //构造方法2 IPEndPoint iep = ); TcpClient ...

  5. edmx代码分析

    http://www.cnblogs.com/FoundationSoft/archive/2011/01/08/1930479.html 本文分析Entity Framework从数据库自动生成的模 ...

  6. java编程思想-复用类总结

    今天继续读<java 编程思想>,读到了复用类一章,看到总结写的很好,现贴上来,给大家分享. 继承和组合都能从现有类型生成新类型.组合一般是将现有类型作为新类型底层实现的一部分来加以复用, ...

  7. 【浅谈html5 响应式布局之自动适应屏幕宽度】

    允许网页宽度自动调整 “自适应网页设计”到底是怎么做到的?其实并不难. 首先,在网页代码的头部,加入一行viewport元标签. <meta name=”viewport” content=”w ...

  8. Linux防火墙:iptables禁IP与解封IP常用命令

    在Linux服务器被攻击的时候,有的时候会有几个主力IP.如果能拒绝掉这几个IP的攻击的话,会大大减轻服务器的压力,说不定服务器就能恢复正常了. 在Linux下封停IP,有封杀网段和封杀单个IP两种形 ...

  9. UIProgressView(进度条控件)

    UIProgressView *pr=[[UIProgressView alloc]init]; pr.frame=CGRectMake(150.0, 190.0, 130.0, 30.0);//进度 ...

  10. JAVA 5.17习题

    1.编写并测试一个代表地址的Address类,地址信息由国家.省份.城市.街道.邮编组成,并可以返回完整的地址信息. //======================================= ...