笔记
1.十进制转k进制
可以用短除法,口诀——除以k取余数,余数逆序存放
2.k进制转十进制
带权求和——了解每一位转化为对应进制的权值。每一位数字乘以k的权值次方求和
3.2的整数幂次进制快转
2个二进制位表示一个4进制位
3个二进制位表示一个8进制位
4个二进制位表示一个16进制位
4.位运算
按位与 &——对应位都为1,结果为1,否则为0
按位或 |——对应位都为0,结果为0, 否则为1
按位异或 ^——对应位相同为0,不同为1
按位取反~——0变1,1变0 (符号位也会变化)
按位左移 <<——整体左移,右边空位补0——左移一位等价于乘以2
按位右移 >>——整体右移,左边空位补符号位——右移一位等价于除以2
5.存储与计算原理
原码、补码、反码
正数的原码补码反码都一样
负数:
原码最高位为符号位1
反码:除符号位按位取反
补码:反码+1.
6.拓展内容——小数进制转化方法
乘k取整,直到没有小数全为0,否则需要保留精确到几位。
例如:10.75十进制转为二进制:
首先,分为两部分:整数部分——10=(1010)B
小数部分——0.75=(0.11)B
正数的原码补码反码不变
负数
原码,首位(符号位)为1,其余正常除2取余
反码,首位不变,其余反过来(0<->1)
补码,反码+1
做有负数的计算的时候,用补码
算出来的结果需要-1变成反码,再反过来变成原码
八进制和十六进制
#include<bits/stdc++.h>
using namespace std;
// 28%2 = 0 -> 28/2 = 14
// 14%2 = 0 -> 14/2 = 7
// 7%2 = 1 -> 7/2 = 3
// 3%2 = 1 -> 3/2 = 1
// 1%2 = 1 -> 1/2 = 0
int a[1005];
int cnt; //cnt表示有几个余数
int n;
int main(){
cin >> n;
int n1 = n;
while(n){
a[++cnt] = n%8;
n /= 8;
}
for(int i=cnt; i>=1; i--) cout << a[i];
cout << endl;
memset(a, 0, sizeof(a)); //重置a数组全部为0
cnt = 0;
//157%16=13,157/16=9
//9%16 = 9, 9/16 = 0
while(n1){
a[++cnt] = n1%16;
n1 /= 16;
}
//10->'a'(97)
//11->'b'(98)
//12->'c'(99)
for(int i=cnt; i>=1; i--) {
if(a[i]<10) cout << a[i];
else cout << (char)(a[i]+87);
}
return 0;
}