php运算符的特殊用法

前言

这些运算符的使用,在这里默认是在php环境中

计算机码

计算机内部都是使用二进制进行数据保存,在计算机中数据(数值)分为有符号数据(区分正负)和无符号数据(全部代表数值)。而在正负数之间存在一个+0和-0的关系,为了正确的识别正负数(左侧最高位:0表示正,1表示负),所以产生了所谓的计算机码。

计算机码分类
原码:数值绝对值转换成的二进制
反码:符号位不变,其他位取反(负数)
补码:反码加1(负数)

其中,规定正数的原码、反码和补码一致,负数有原码、反码和补码之分
示例

5
00000101
-5

原码计算:改变符号位:10000101
反码计算:符号位不变,其他取反:11111010
补码计算:反码加1:11111011(这就是-5最终在系统中存储的方式)
注:如果想要从系统中取出,从下往上依次反过来执行即可

位运算符

位:bit是计算机存储的最基本单位,只有两个值,0或1,位运算就是使用最基本的位上的值参与运算。
^:按位异或,两个位进行运算,两个不同则为1,相同则为0
~:按位取反,一个位进行运算,原来为0则变成1,为1则变成0
<<:按位左移,将所有的位向左移动右侧指定的位数,左侧溢出,右侧补0
>>:按位右移,将所有的位向右移动右侧指定的位数,右侧溢出,左侧补符号位(正数为0,负数为1)
&:按位与,两个位进行运算,都为1则返回1,否则返回0
|:按位或,两个位进行运算,一个为1就返回1,都为0返回0

注:
1、系统进行任何位运算的时候都是使用的补码
2、运算结束之后都必须转换成原码才是最终要显示的数据

一、^

介绍:^表示异或运算
异或运算规则:将十进制转换为补码后异或

0^0 = 0
1^0 = 1
0^1 = 1
1^1 = 0
即同为假,异为真(同假异真)

例如:10^24
计算过程:

10^24运算步骤:
(1)因为正数,所以补码即原码,也就是二进制:00001010^00011000
(2)按规则进行异或运算:
00001010
00011000
结果为:00010010,转换为十进制为18

Tip:0^未知数,结果都是未知数

二、~

介绍:~表示取反运算,即将补码全部取反,例:0000,取反后为1111,但常常并不是这样使用,通常如下:
例如:~9,但它的值为-10,why?
取反运算规则:
1、原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1
2、补码计算
(1)正数的补码表示:正数的补码 = 原码
(2)负数的补码 = {原码符号位不变} + {数值位按位取反后+1} or = {原码符号位不变} + {数值位从右边数第一个1及其右边的0保持不变,左边按位取反}
具体可以参考:https://zhidao.baidu.com/question/148760603.html
计算过程:

~9计算过程:
(1)9因为正数,所以补码即原码,也就是的二进制:00001001
(2)补码全部取反运算:11110110
(3)最后要转为原码,因为符号位为1表示负数,所以进行补码减1,获得反码结果为:11110101
(4)反码转原码,除符号位外,都取反,原码结果为:10001010	 
(5)原码转10进制:因为原码符号位为1,所以结果为负数,所以转为0后,当作二进制计算其值,再加负号,结果为:-10
~-9计算过程
(1)-9的原码:10001001
(2)-9的反码:11110110
(3)-9的补码(反码加1):11110111 
(4)~取反,所有位取反,包括符号位:00001000
(5)因为取返后补码的符号位为0,所以表示该数值为正数,因为正数,所以原码等于补码等于二进制数,结果为:00001000
(6)二进制转十进制结果为:8

Tip:最后总结一下,如果想要666或者999等指定的,可以直接~~666或~~999

三、<<或>>

介绍:左移运算是将一个补码位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0。右移运算是将一个补码位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位一律补0,或者补符号位,这由不同的机器而定。
例:10<<3和10>>3
计算过程:

10<<3运算步骤:
(1)10转换为补码(正数的原码、反码和补码一致):00001010
(2)全部向左移动三位,被移动的位被丢弃,右边的空位一律补0,移动后为:01010000 
(3)最后将补码转换为原码因为正数,所以补码即原码,也就是二进制,最后转换为十进制,结果为80

10>>3
(1)10转换为补码(正数的原码、反码和补码一致):00001010
(2)二进制数全部向右移动3位,被移动的位被丢弃,左边移出的空位一律补0,移动后为:00000001
(3)最后将补码转换为原码因为正数,所以补码即原码,也就是二进制,最后转换为十进制,结果为1

四、&

介绍:&表示位运算符
与运算的规则:0&0=0;0&1=0;1&0=0;1&1=1,即两位同为1,结果为1,否则为0
例:10&24
计算过程:

10&24运算步骤
因为正数,所以补码即原码,也就是二进制
(1):补码运算
00001010&00011000 
(2)与运算:
00001010
00011000
结果为:00001000,转换为十进制为8

五、|

介绍:|表示或运算
或运算规则:0&0=0;0&1=1;1&0=1;1&1=1,即或运算的两个数只要有一个值为1,那么结果就为1
例:10|24
计算过程:

10|24
(1)因为正数,补码等于原码等于二进制数: 00001010 | 00011000
(2)或运算:
00001010
00011000
结果为:00011010,转换为十进制为26
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1stPeak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值