[TOC]
> 計算機中是以補碼進行計算,原碼進行顯示
> 正數的反碼補碼都是其本身
> 負數的反碼是原碼符號位不變其他取反,補碼是反碼+1
* 對于計算機, 加減乘數已經是最基礎的運算, 要設計的盡量簡單. 計算機辨別"符號位"顯然會讓計算機的基礎電路設計變得十分復雜! 于是人們想出了將符號位也參與運算的方法. 我們知道, 根據運算法則減去一個正數等于加上一個負數, 即: 1-1 = 1 + (-1) = 0
* 計算機存儲的就是補碼,使用補碼進行運算免去了符號位帶來的麻煩
* 在計算機內,定點數有3種表示法:**原碼、反碼和補碼**
* 原碼就是二進制定點表示法,即最高位為符號位,“0”表示正,“1”表示負,其余位表示數值的大小。
## 1. 二進制
計算機的存儲全是01的二進制,最小單位是byte(8位)
**+21,其二進制表示形式是00010101,則其補碼同樣為00010101**
**-21的表示方式**
1. 按照概念其**絕對值為00010101**,各位**取反為11101010**,**再加1**為11101011,即-21的二進制表示形式為11101011
**1. byte為一字節8位,最高位是符號位,即最大值是01111111,因正數的補碼是其本身,即此正數為01111111**
2. 10000000是最小負數的補碼表示形式,我們把補碼計算步驟倒過來就即可。10000000減1得01111111然后取反10000000
因為負數的補碼是其絕對值取反,即10000000為最小負數的絕對值,而10000000的十進制表示是128,所以最小負數是-128
## 1. 八進制
以0開頭
## 2. 十六進制
以0x開頭,1-F,一個數字代表四位
f代表15,二進制表示00001111
## 3. 練習題

```
0Xf000000000000000補碼為1111000000000000000000000000000000000000000000000000000000000000
0x7FFFFFFFFFFFFFFF補碼為0111111111111111111111111111111111111111111111111111111111111111
a-b=a+(-b)=
1111000000000000000000000000000000000000000000000000000000000000+
1000000000000000000000000000000000000000000000000000000000000001=
10111000000000000000000000000000000000000000000000000000000000001(高位溢出舍去)
則結果為
0111000000000000000000000000000000000000000000000000000000000001=
2^62+2^61+2^60+1
```
答案為C
## 1-2 的二進制運算
1的原反補碼都相同,都是
0000 0001
-2 的原碼是
1000 0010
補碼是符號位不變,取反
1111 1101
加1
1111 1110
```
0000 0001
+
1111 1110
=
1111 1111
```
結果是負數,減一取反,得到原碼
1000 0001 即為-1
## 練習
~~~java
System.out.println((byte) 129);
System.out.println((byte) -129);
System.out.println("~b2: " + ~10);
~~~
結果是:
~~~
-127
127
~b2: -11
~~~
**計算機中是以補碼進行計算**
正數的反碼補碼都是原碼,如:
10
原碼: `1010`
反碼: `1010`
補碼:`1010`
負數 -10
原碼 `10000000 00000000 00000000 00001010`
反碼(符號位不變,其余位取反) `01111111 11111111 11111111 11110101`
補碼(反碼+1): `01111111 11111111 11111111 11110110`
### (byte) 129
對于129,二進制為
`00000000 00000000 00000000 10000001`
其補碼:`00000000 00000000 00000000 10000001`
由于byte只占1字節即8位,所以,上面截取8位置后如下:`10000001`
此時最高位為1即負數,該二進制減1即是反碼
反碼:`10000000`
原碼:`11111111`
即-127,所以`(byte)129`的結果就是`-127`
### (byte) -129
\-129 二進制為
原碼:`10000000 00000000 00000000 10000001`
反碼(原碼符號位不變,其余取反):`11111111 11111111 11111111 01111110`
補碼為(反碼+1) :
`11111111 11111111 11111111 01111111`
截取8位(低八位)后為:`01111111`
為正數,其原碼反碼補碼均為`01111111`即127
所以`(byte)-129`的結果就是`127`
### ~10
10的二進制為
`00000000 00000000 00000000 00001010`
補碼是本身,取反之后為
`11111111 11111111 11111111 11110101`
此時最高位為1,負數,即是負數的補碼
該反碼(補碼-1)
`11111111 11111111 11111111 11110100`
對應的原碼:
`10000000 00000000 00000000 00001011` 即-11
所以`~b2`的結果是`-11`
## 4. 字節運算
## 4.1 與運算符
與運算符用符號“&”表示,其使用規律如下:
兩個操作數中位都為1,結果才為1,否則結果為0,例如下面的程序段。
聲明并初始化: int a = 10; int b = 6;
二進制: a = 0000 1010
b = 0000 0110
結算結果: 0000 0010 轉化為十進制: 2
### 4.2 或運算符
或運算符用符號“|”表示,其運算規律如下:
兩個位只要有一個為1,那么結果就是1,否則就為0,
聲明并初始化: int a = 10; int b = 6;
二進制: a = 0000 1010
b = 0000 0110
結算結果: 0000 1110 轉化為十進制: 14
### 4.3 異或運算符
異或運算符是用符號“^”表示的,其運算規律是:
兩個操作數的位中,相同則結果為0,不同則結果為1。
聲明并初始化: int a = 10; int b = 6;
二進制: a = 0000 1010
b = 0000 0110
結算結果: 0000 1100 轉化為十進制: 10
### 4.4 非運算, 按位取反
~5 非運算
補碼是: 00000101
補碼取反(非): 11111010
補碼轉反碼-1: 11111001
反碼轉原碼(最高位為1,負數):10000110
結果: -6
## 5.字節位移
### 5.1 左移 (<< )
?右邊空出的位用0填補高位左移溢出則舍棄該高位。計算機中常用補碼表示數據,注,用補碼計算

### 5.2 右移 (>> )
?左邊空出的位用0或者1填補。正數用0填補,負數用1填補。注:不同的環境填補方式可能不同;低位右移溢出則舍棄該位。

### 5.3 無符號右 、移 (>>> )
?無符號右移:正數與右移規則一樣,負數的無符號右移,就是相應的補碼移位所得,在高位補0即可(右移后,高位0,都是正數,所以得到的就是原碼=補碼=反碼),直接輸出

- 計算機網絡
- 基礎_01
- tcp/ip
- http轉https
- Let's Encrypt免費ssl證書(基于haproxy負載)
- what's the http?
- 網關
- 網絡IO
- http
- 工具
- Git
- 初始本地倉庫并上傳
- git保存密碼
- Gitflow
- maven
- 1.生命周期命令
- 聚合與繼承
- 插件管理
- assembly
- 資源管理插件
- 依賴范圍
- 分環境打包
- dependencyManagement
- 版本分類
- 找不到主類
- 無法加載主類
- 私服
- svn
- gradle
- 手動引入第三方jar包
- 打包exe文件
- Windows
- java
- 設計模式
- 七大原則
- 1.開閉原則
- 2. 里式替換原則
- 3. 依賴倒置原則
- 4. 單一職責原則
- 單例模式
- 工廠模式
- 簡單工廠
- 工廠方法模式
- 抽象工廠模式
- 觀察者模式
- 適配器模式
- 建造者模式
- 代理模式
- 適配器模式
- 命令模式
- json
- jackson
- poi
- excel
- easy-poi
- 規則
- 模板
- 合并單元格
- word
- 讀取
- java基礎
- 類路徑與jar
- 訪問控制權限
- 類加載
- 注解
- 異常處理
- String不可變
- 跨域
- transient關鍵字
- 二進制編碼
- 泛型1
- 與或非
- final詳解
- Java -jar
- 正則
- 讀取jar
- map
- map計算
- hashcode計算原理
- 枚舉
- 序列化
- URLClassLoader
- 環境變量和系統變量
- java高級
- java8
- 1.Lambda表達式和函數式接口
- 2.接口的默認方法和靜態方法
- 3.方法引用
- 4.重復注解
- 5.類型推斷
- 6.拓寬注解的應用場景
- java7-自動關閉資源機制
- 泛型
- stream
- 時區的正確理解
- StringJoiner字符串拼接
- 注解
- @RequestParam和@RequestBody的區別
- 多線程
- 概念
- 線程實現方法
- 守護線程
- 線程阻塞
- 筆試題
- 類加載
- FutureTask和Future
- 線程池
- 同步與異步
- 高效簡潔的代碼
- IO
- ThreadLocal
- IO
- NIO
- 圖片操作
- KeyTool生成證書
- 壓縮圖片
- restful
- 分布式session
- app保持session
- ClassLoader.getResources 能搜索到的資源路徑
- java開發規范
- jvm
- 高并發
- netty
- 多線程與多路復用
- 異步與事件驅動
- 五種IO模型
- copy on write
- code style
- 布隆過濾器
- 筆試
- 數據庫
- mybatis
- mybatis與springboot整合配置
- pagehelper
- 分頁數據重復問題
- Java與數據庫之間映射
- 攔截器
- 攔截器應用
- jvm
- 堆內存測試
- 線程棧
- 直接內存
- 內存結構
- 內存模型
- 垃圾回收
- 調優
- 符號引用
- 運行參數
- 方法區
- 分帶回收理論
- 快捷開發
- idea插件
- 注釋模板
- git
- pull沖突
- push沖突
- Excel處理
- 圖片處理
- 合并單元格
- easypoi
- 模板處理
- 響應式編程
- reactor
- reactor基礎
- jingyan
- 規范
- 數據庫