DAY1-二进制和位运算

二进制

难易度:中等 计算机使用二进制,每一位上的数字由0和1组成。

为什么计算机选择二进制

  1. 很难在一种物质上体现十种不同的状态,即使表示出来也很容易出错
  2. 电线的高、低电平(电压)表示两种状态非常方便,并且不容易出错

二进制下的加减运算

二进制的加减法与十进制类似,加法时:十进制为逢十进一,二进制是逢二进一;减法时:十进制是借一当十,二进制是借一当二。

十进制和二进制下的加、减法有什么不同呢?

  • 进位不同 逢十进一、逢二进一

  • 借位不同 借一当十、借一当二

十进制转二进制

整数部分短除法、小数部分短乘法

二进制转十进制

每位数字乘以它的权重累加到一起。

  • 如何计算权重 二进制位权为2(数位−1)2(数位−1)

  • 如何转换十进制 ���+=�[�]∗�sum+=a[i]∗w

原码、反码和补码

机器数

与普通二进制数不同,最高位作为符号位,1表示负数,0表示正数,其余位数表示真值。

原码

原码就是用第一位表示符号,其余位表示值。比如如果是8位二进制:

反码

反码的表示方法是:

  • 正数的反码是其本身。
  • 负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

补码

补码的表示方法是:

  • 正数的补码就是其本身。
  • 负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(即在反码的基础上+1)

既然原码才是被人脑直接识别并用于计算表示方式,为何还会有反码和补码呢?

  1. 电脑计算减法是转换成加法进行计算,且符号位参与到运算中。 但是:

  1. 所以为了解决减法转换加法错误的问题,反码出现了。 但是:

  1. 为了解决-0的问题,出现了补码。并且把-0的编码作为数字范围内的最小值,所以数字范围增加了1个。

    8位机器数能表示的数据范围: -128 ~ 127

    32位机器数能表示的数据范围: -2147483648 ~ 2147483647

进制转换

难易度:中等

不同的进制

进制转化

 

  🌰 程序实现将n进制数转换成m进制。

//将n进制数字num,转换成m进制数
//(其中2 <= n,m <= 16,n进制数对应的十进制的值不超过int范围)
#include <iostream>
#include <string> 
using namespace std;
int main() {
	int n, m;
	string num;
	cin >> n >> num >> m;
	//n进制num转换成十进制数ans
	int ans = 0, w = 1;
	int len = num.length();
	for (int i = len - 1; i >= 0; i--){
		if ('A' <= num[i] && num[i] <= 'F'){
			ans = ans + (num[i] - 'A' + 10) * w; 
		} else {
			ans = ans + (num[i] - '0') * w;
		}
		w *= n;
	}
	//十进制数ans转换成m进制
	char mnum[100] = {}, cnt = 0;
	while (ans != 0){
		int tmp = ans % m;
		if (tmp >= 10){
			mnum[cnt++] = tmp - 10 + 'A';
		}else{
			mnum[cnt++] = tmp + '0';
		}
		ans /= m;
	} 
	for (int i = cnt - 1; i >= 0; i--){
		cout << mnum[i];
	}
	return 0;
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值