您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
php位运算
发布时间:2017-02-22 20:45:20编辑:雪饮阅读()
1、二进制的最高位是符号位: 0表示正数,1表示负数
2、正数的原码,反码,补码都一样
3、负数的反码=它的原码符号位不变,其它位取反(0>1,1->0)
4、负数的补码=它的反码加1
5、0的反码补码都是0
6、php没有无符号数,换言之,php的数字都是有符号的
7、在计算机运算的时候都是以补码的形式运算的
原码:用二进制来表示这个数就叫做原码
最高位:数字从左到右,最左边叫做最高位。
原码:00000000 0000000 0000000 000000101=1*2的零(从右到左1的下标为0)次方+0*2的一(从右到左0的下标为1)次方+1*2的二(从右到左第二个1的下标为0)次方=1+0+4=5
依次类推即可。
负数的反码:
-1的原码:10000000 00000000 00000000 00000001
-1的反码:11111111 11111111 11111111 11111110
-1的补码:11111111 11111111 11111111 11111111
为什么原码是32位?
x86架构下,int类型字符占用4字节,而每个字节占8位
php中的位运算
按位与:&(两位全为1,结果为1)
按位或:|(两位有一个为1,结果为1)
按位异或:^(两位一个为0,一个位为1,结果为1)
按位取反:~(0->1,1->0)
例如:~2=-3 2&3=2 2|3=3 2^3=1;
php中有移位运算符:
>>,<<算术右移和算术左移,运算规则:
算术右移:低位溢出,符号位不变,并用符号位补溢出的高位
算术左移:符号位不变,低位补0
位运算练习题:
做题思路:在计算机运算的时候都是以补码的形式运算的
~2=?
步骤:
首先求出2的补码,满2进一所以2的原码是:00000000 00000000 00000000 00000010
由~按位取反后的补码(非真正补码,是通过~以计算机生成的补码)是:11111111 11111111 11111111 11111101
然后再根据补码推算出原码:最高位是1,所以结合“负数的补码=它的反码加1”和“负数的反码=它的原码符号位不变,其它位取反(0>1,1->0)”即可推算出
最终的原码,那么结果就可以从原码的末尾依次用2的次方和计算出来
2&3=?
2|3=?
~-5=?
13&7=?
5|4=?
-3^3=?
通过php来进行位运算可以验证你的推算结果如:
<?php
$a=~2;
echo $a;
?>
php快速计算位移运算:
<?php
$a= 1<< 2;
echo $a;
?>
位运算小练习:
~2=?
答:
2是int类型字符,在x86架构下int类型占用4 字节,
而每个字节占用8位再结合满二进一以及"二进制的最高位是符号位: 0表示正数,1表示负数"可得2的32位二进制原码是
00000000 00000000 00000000 00000010
右~得到取反后为(计算机在运算时是以补码运算的,所以下面的32位二进制为补码):
11111111 11111111 11111111 11111101
再求出取反后的32位二进制码对应的反码:右最高位是1,那么该数应是负数。根据“负数的补码=它的反码加1(非按位)”,所以求得反码为:
11111111 11111111 11111111 11111100
再根据“负数的反码=它的原码符号位不变,其它位取反(0>1,1->0)”可得新的原码为:
10000000 00000000 00000000 00000011
然后将该原码从右向左计算成10进制数为:
符号位(1为-)(1*2的0次方)+(1*2的1次方)+(0*2的2次方)++(0*2的3次方)+......+(0*2的31次方)
所以计算结果为:-(1+2+0+.....+0)=-3
解题步骤:始终记住,计算机是以补码运算,所以位运算时都是要将数字部分先转换为补码,然后再根据位运算符求得最终结果(仍然是补码),最后根据补码算原码,再根据原码算出10进制数字
位移运算实例:
<<2=?
答:2是正数,所以其补码是:
00000000 00000000 00000000 00000010
<<后为:
00000000 00000000 00000000 00001000
根据最高位符号位为0,所以新的原码为:
00000000 00000000 00000000 00001000
转换为10进制为:
0*2的0次方+0*2的1次方+0*2的2次方+1*2的3次方+。。。。+0*2的31次方=8
关键字词:php,位运算,雪饮
下一篇:php生成二维码