二进制

二进制

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

image

进制转换:

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;
}
posted @ 2021-10-14 20:17  时间最考验人  阅读(500)  评论(0编辑  收藏  举报