二进制位运算
- 二进制的最高位是符号位,php中的数都是有符号的,正数是0负数是1;整数都是4个字节,1个字节有8位
- 正数的原码、反码、补码都一样,0的反码、补码都是0
- 负数的反码:符号位不变,其它位全部取反
- 负数的补码:负数的反码+1
- 在计算机运算的时候,都是以补码的方式来运算的
题目1: ~2=?
2的原码:00000000 00000000 00000000 00000010 正数的原码、补码、反码一样
~$a ,按位取反 ,将 $a 中为 0 的位设为 1,反之亦然。
解题思路:1.首先找出2的补码
2.全部取反后的补码:11111111 11111111 11111111 11111101
3.取反后的反码:11111111 11111111 11111111 11111100
4.取反后的原码:10000000 00000000 00000000 00000011
5.计算后的数字结果:-3
题目2: 2&3 =?
$a&$b 将把 $a 和 $b 中都为 1 的位设为 1。
解题:
1.2的补码:00000000 00000000 00000000 00000010
3的补码:00000000 00000000 00000000 00000011
2.都为1的设置为1之后补码为 : 00000000 00000000 00000000 00000010
3.反码为不变
4.原码为不变
5.计算数值为:2
题目3: -3>>2 = ?
向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。
解题:
-3的原码: 10000000 00000000 00000000 00000011
-3的反码: 11111111 11111111 11111111 11111100
-3的补码: 11111111 11111111 11111111 11111101
补码右移两位后的补码:11111111 11111111 11111111 11111111
补码->反码:11111111 11111111 11111111 1111110
反码->原码:10000000 00000000 00000000 00000001
数值结果:-1
~ $a |
Not(按位取反) | 将 $a 中为 0 的位设为 1,反之亦然。 |