# 二进制的特性
* 只有 0 和 1 组成, 逢二进一,借一当二
*二进制中有原码,反码,补码的概念
*正数的原码,补码,反码都是它本身
*0 的原码,反码,补码都是它本身
*负数的的反码是原码的位数取反,即 0=》1, 1=》0
*负数的补码是反码加+1
*在二进制当中,最高位代表数的正负,0 代表正数, 1 代表负数
*在PHP当中的位运算,都是以补码的形式进行的
*在PHP当中,所有的数都是有符号的,即不考虑无符号数的情况
# 二进制位运算
1. `&`(位与):二进制中相对应的位都是 1 的位才为 1
```
var_dump(2 & 3);
2 的原码,反码,补码
00000000 00000000 00000000 00000010
3 的原码,反码,补码
00000000 00000000 00000000 00000011
按位与 2&3
00000000 00000000 00000000 00000010
// 2
```
2. `|`(位或):二进制当中相对应的位只要有一个是 1 的位就为 1
```
var_dump(2 | 3);
2 的原码,反码,补码
00000000 00000000 00000000 00000010
3 的原码,反码,补码
00000000 00000000 00000000 00000011
按位与 2|3
00000000 00000000 00000000 00000011
// 3
```
3. `~`(位取反):二进制中把相对应的位为 1 的取 0 ,为 0 的取 1
```
var_dump(~3);
var_dump(~2);
2 的原码,反码,补码
0 00000010
按位取反 ~2
1 11111101
最高位是1,是负数
得到反码
1 00000010
得到补码
1 00000011
// -3 1 * 1 + 1 * 2
3 的原码,反码,补码
0 00000011
按位取反 ~3
1 11111100
最高位是1,代表负
得到反码
1 00000011
得到补码
1 00000100
// -4
```
4. `^`(位异或):二进制当中相对应的位一个为 1 一个为 0 的位 才为 1
```
var_dump(2 ^ 3);
2 的原码,反码,补码
00000000 00000000 00000000 00000010
3 的原码,反码,补码
00000000 00000000 00000000 00000011
按位异或 2^3
00000000 00000000 00000000 00000001
// 1
```
5. `<<`(位左移):将一个运算对象的各二进制位全部左移若干位(**左边的二进制位丢弃,右边补0**)。
设 a=1010 1110,`a = a<< 2` 将a的二进制位左移2位、右补0,即得a=1011 1000。
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
```
$a = -2;
echo $a<<2;
// 源码 $a = 10000000 00000000 00000000 00000010
// 反码 11111111 11111111 11111111 11111101
// 补码 11111111 11111111 11111111 11111110 反码 =》 补码 反码+1
// 左移两位,符号位不变,最高位移出,低位用0补齐
// 11111111 11111111 11111111 11111000
//补码的反码,补码减一
// 111111111 11111111 11111111 11110111
//反码的源码,符号位不变,取反
// 100000000 00000000 00000000 00001000
// -8
```
6. `>>`(位右移):将一个数的各二进制位全部右移若干位(**正数左补0,负数左补1,即左边用符号位补充,右边丢弃**)。
例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。
操作数每右移一位,相当于该数除以2。
`>>>`(位无符号右移):无符号右移,也叫逻辑右移(**若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0**)。
```
echo -2>>3;
//原码 10000000 00000000 00000000 00000010
//反码 11111111 11111111 11111111 11111101
//补码 11111111 11111111 11111111 11111110
//补码右移3位,符号位不变,最低位移出,移出位使用最高位符号位填充
// 11111111 11111111 11111111 11111111
//反码 11111111 11111111 11111111 11111110
//原码 10000000 00000000 00000000 00000001
// -1
echo -2>>>3;
//原码 10000000 00000000 00000000 00000010
//反码 11111111 11111111 11111111 11111101
//补码 11111111 11111111 11111111 11111110
//补码右移3位,符号位不变,最低位移出,移出位使用0填充
// 00011111 11111111 11111111 11111111
//反码 00011111 11111111 11111111 1111111
//原码 00011111 11111111 11111111 1111111
// 536870911
```
- 开发语言
- java
- Java基础篇
- Java多线程篇
- 进程和线程的区别,进程间如何通信
- 什么是线程上下文切换
- 什么是死锁
- 死锁的必要条件
- Synchrpnized和lock的区别
- 什么是AQS锁
- 为什么AQS使用的双向链表
- 有哪些常见的AQS锁
- sleep()和wait()的区别
- yield()和join()区别
- Java线程池
- SpringBoot
- spring boot 项目开发常用目录结构
- Mybatis-Plus
- MyBatisPlus的CRUD操作
- Mybatis-Plus主键ID生成策略
- JVM
- JVM组成
- 字节码文件的组成
- 类的生命周期
- JVM、JRE和JDK
- arthas
- 使用阿里arthas不停机解决线上问题
- Java IO
- php
- 安装swoole
- composer部分
- windows安装composer
- composer PSR-4映射
- swoole部分
- swoole安装
- thrift部分
- linux下安装thrift
- PHP使用Thrift
- lnmp部分
- 架构的工作原理
- tp5框架生命周期
- zookeeper部分
- zookeeper安装
- sort
- TCP和UDP的区别
- 软件
- xdebug
- vscode+phpstudy+xdebug无法断点(踩坑记)
- Hyperf框架
- 注解
- 开发方案
- 抖音
- 抖音达人视频发布与统计
- 安全问题
- 微信
- 微信公众平台怎样实现用户点击链接向公众号发消息
- CDN加速OSS计费说明
- 程序设计
- 正则表达式
- 面向对象
- 设计模式
- 创建型模式
- 工厂模式
- 单例模式
- 结构型模式
- 适配器模式
- 行为型模式
- 策略模式
- 观察者模式
- 算法部分
- 位运算
- 排序算法
- 双指针
- 贪心算法
- 动态规划
- 二分查找
- 华为题库
- 技术栈
- mq
- MQ 的优势和劣势
- rabbitmq部分
- windows安装rabbitmq
- RabbitMQ 简介
- 工作模式
- 高级特性-消息可靠投递-confirm
- 高级特性-消息可靠投递-return
- 高级特性-Consumer Ack
- 高级特性-消费端限流
- 高级特性-TTL
- 高级特性-死信队列
- Centos7下安装rabbitmq
- 数据库
- MongoDB
- MongoDB 相关概念
- Mysql
- 索引总结
- MySQL架构图
- InnoDB和MyISAM的区别
- 索引设计与优化
- 悲观锁和乐观锁
- mysql如何解除死锁状态
- 查询慢
- 数据库主键的优缺点
- MySQL锁详解
- SQL语句分类
- 开查询账号
- 数据库迁移
- MySQL实战知识点
- mysql清理binlog日志
- 面试总结
- 事务隔离
- 聚集索引与非聚集索引
- B树和B+树
- docker
- docker-desktop安装的坑点
- docker在linux平台下安装
- Ubuntu安装Docker
- 常用命令
- 适用于 Linux 的 Windows 子系统没有已安装的分发版
- docker核心架构图
- docker安装lnmp环境
- docker安装redis
- dockerfile
- docker-compose
- linux
- Ubuntu 更换国内源
- centos
- 常用命令
- virtualbox
- 关于VirtualBox安装Ubuntu时界面显示不全,没有下一步选项
- linux复制当前目录到其子目录下
- 命令
- cat和>、>>
- crontab命令
- 查看当前目录的文件大小
- shell登录和非shell登录
- nginx
- 正向代理
- 反向代理
- 负载均衡
- 分割Nginx的access.log日志并保留30天一个月时长,自动删除多余的日志
- linux安装nginx
- git
- 生成秘钥
- 常用命令
- Linux中git保存用户名密码
- git清除账号密码
- 设置git store 存储账号密码
- git submodule 使用小结
- 微服务
- 微服务技术栈
- nacos
- Nacos服务分级存储模型
- Nacos配置管理-配置热更新
- Nacos集群搭建
- 微服务保护
- 初识Sentinel
- 隔离和降级
- es
- DSL查询语法-相关性算法
- DSL查询语法-FunctionScoreQuery
- DSL查询语法-BooleanQuery
- 搜索结果处理-排序
- es深度分页问题
- 自动补全
- elasticsearch 设置密码
- redis
- redis简介
- 安装redis扩展
- redis数据类型
- redis常见问题
- PHP 使用 Redis 实现分布式锁
- 缓存更新策略
- [ Redis ] AOF 和 RDB 的相关介绍以及相关配置
- 分布式锁的8大坑
- 分布式锁-Redisson
- 内存回收
- UV统计
- Redis主从集群
- redis哨兵
- Redis安装目录下常见文件
- 通讯原理概述
- linux安装redis
- windows
- Win系统端口被占用
- Windows10 WSL2限制cpu和内存
- jekins
- 持续集成
- centos卸载gitlab
- jenkins搭配gitlab的webhook实现自动化部署
- 大数据
- Linux集群分发脚本xsync
- hadoop
- hadoop安装
- hadoop配置文件
- clickhouse
- ClickHouse 安装部署
- flink
- 数据仓库
- zookeeper
- zookeeper分布式安装
- ZK集群启动停止脚本
- kafka
- kafka分布式安装
- kafka集群启动停止脚本
- flume
- flume分布式安装
- Flume配置
- Flume使用
- maxwell
- Maxwell简介
- Maxwell部署
- Maxwell使用
- MaxwellBootstrapUtility - Connections could not be acquired from the underlying database
- 线上事故