二進制
二進制逢二進一,每位的取值只能是0或1
原碼、反碼、補碼
注:計算機里都是以補碼的形式存儲數據的!
原碼:最高位為符號位,0代表正數,1代表負數,非符號位為該數字絕對值的二進制(以一個字節(8位)為例)
5 -5
原碼:0000 0101 1000 0101
反碼:正數的反碼就是原碼,負數的反碼是對原碼按位取反,只是最高位(符號位不變)。
5 -5
原碼:0000 0101 1000 0101
反碼:0000 0101 1111 1010
補碼:正數的補碼與原碼一致,負數的補碼是該數的反碼加一(對負數原碼取反加一)
【補充】二進制相加:加運算:0+0=0,0+1=1,1+0=1,1+1=10。逢2進1;
5 -5
原碼:0000 0101 1000 0101
反碼:0000 0101 1111 1010
反碼:0000 0101 1111 1011
知道補碼求原碼
1.正數的原碼與原碼相等
2.負數:補碼減1,再取反就可以得到原碼(最高位保持不變)
補碼:1111 1011 反碼:1111 1010 原碼:1000 0101
計算機里都是以為什么以補碼的形式存儲數據的?
計算機CPU中有加法器,它會進行加法的計算,不存在減法器。如果要進行減法:
例: 5 - 5 ----> 5 + (-5)
進制轉換:
1、八進制、十六進制與二進制之間的轉換
八進制逢八進一,每一位的取值范圍為0~7。若將二進制從低位到高位每3位組成一組(2^3=8),
每組值的大小是(000)2(111)2,即07,就可以把二進制轉為八進制。
(100100001101)2 每三位得一組:(100,100,001,101)2 則可表示八進制(4415)8
十六進制逢十六進一,每一位的取值范圍為015,其中,1015分別用A、B、C、D、E、F表示。若將二進制從低位到高位每4位組成一組(2^4=16),每組值的取值范圍是(0000)2(1111)2,即015,就可以把二進制轉為十六進制。
(100100001101)2 每四位得一組:(1001,0000,1101)2 則可表示八進制(90D)16
2、十進制轉為其它進制
整數部分:除以基數逆序取余數至商為0為止
小數部分:乘於基數順序取整數部分至(去掉整數后的)小數為0或達到需要的精度為止.
【十進制數轉為二進制數】(十進制轉為其它進制,相應的把2換為其它即可!)
#include<iostream>
using namespace std;
const int N = 100000+10;
int q[N];
int main()
{
int n;
cin>>n;
int k = 0;
while(n != 0)
{
q[k++] = n % 2;
n = n / 2;
}
for(k--; k >= 0; k--) cout<<q[k];
return 0;
}