二进制
二进制逢二进一,每位的取值只能是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;
}