/*
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. ansible模块debug

    示例: # Example that prints the loopback address and gateway for each host - debug: msg="System { ...

  2. linux安装Mac的默认Monaco字体

    Monaco字体是我最喜欢的编程字体,如果你想在linux上面安装,只需要在terminal中执行: curl -kL https://raw.github.com/cstrap/monaco-fon ...

  3. BeautifulSoup高级应用 之 CSS selectors /CSS 选择器

    BeautifulSoup支持最常用的CSS selectors,这是将字符串转化为Tag对象或者BeautifulSoup自身的.select()方法. 本篇所使用的html为: html_doc ...

  4. MySQL好用的数学函数

    最近项目很忙,分给我的功能都比较复杂,还好能应付的下来.在工作的过程中,我发现使用mysql的自带函数能够极大的减少程序的复杂度.这是必然的,使用mysql的函数,能够在程序里面省却很多的循环遍历.但 ...

  5. C语言函数指针的用法

    函数指针是一种在C.C++.D语言.其他类 C 语言和Fortran 2003中的指针.函数指针可以像一般函数一样,用于调用函数.传递参数.在如 C 这样的语言中,通过提供一个简单的选取.执行函数的方 ...

  6. POJ 2942Knights of the Round Table(二分图判定+双连通分量)

    题目链接 题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. ...

  7. ecshop 远程图片本地化

    define('IN_ECS', true); require(dirname(__FILE__) . '/includes/init.php'); $smarty->assign('siteD ...

  8. Install latest R for ubuntu

    ### delete old version rm -rf /usr/local/lib/R /usr/lib/R ~/**/R sudo apt-get autoremove rstudio sud ...

  9. JS左右栏目添加器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 关于敏捷开发方法(Agile Software Development)的阅读笔记

    对“敏捷开发”(Agile Software Development)这个词,我是在这学期邹欣老师<现代程序设计>课上第一次听到的,刚听到时并不知道其具体指什么,只是从字面上直觉其意思应该 ...