进制分类
进制的转换
十进制转二进制

利用短除法进行转换
十进制转八进制
利用短除法进行转换

十进制转十六进制
利用短除法进行转换

练习
请尝试将以下数字转换为二进制、八进制、十六进制
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
105 | 1101001 | 151 | 69 |
78 | 1001110 | 116 | 4E |
24 | 11000 | 30 | 18 |
105 78 24
答案
十进制转二进制
请编写一个程序:将一个十进制n转换为2进制
#include <iostream>
using namespace std;
void Bin(int n){ //将十进制转换为二进制
int a[100]={0};
int i = 0;
while (n != 0){ //进行辗转相除
a[i] = n % 2;
n /= 2;
i++;
}
i--;
while (i >= 0){ //输出结果
cout << a[i];
i--;
}
}
int main(){
int n;
cin >> n;
Bin(n);
}
C++ Program
十进制转二进制
请编写一个程序:将一个十进制n转换为2进制
#include <iostream>
using namespace std;
void Bin(int n){ //将十进制转换为二进制
int a[100]={0};
int i = 0;
while (n != 0){ //进行辗转相除
a[i] = n % 2;
n /= 2;
i++;
}
i--;
while (i >= 0){ //输出结果
cout << a[i];
i--;
}
}
int main(){
int n;
cin >> n;
Bin(n);
}
Python Program
将n转换为k进制
#include <iostream>
using namespace std;
void Oct(int n,int k){
int a[100]={0};
char b[]={'A','B','C','D','E','F'};
int i = 0;
while (n != 0){
a[i] = n % k;
n /= k;
i++;
}
i--;
while (i >= 0){
if (a[i] > 9){
cout << b[a[i]-10];
}else{
cout << a[i];
}
i--;
}
}
int main(){
int n,k;
cin >> n >> k;
Oct(n,k);
}
将二进制转换为其他进制
二进制转十进制:取三合一法
二进制转十进制:取四合一法


cout进制输出
#include <iostream>
#include <bitset>
using namespace std;
int main(){
cout << oct << 35 << endl; //35的八进制
cout << dec << 35 << endl; //35的十进制
cout << hex << 35 << endl; //35的十六进制
cout << bitset<8>(35) << endl; //35的二进制,8表示保留8位输出
}
数据编码
ASCLL码
- ASCLL码是字符在计算机当中的编码规则
- 每个字符在计算机当中都有一个数字唯一表示
利用程序输出ASCLL码
#include <iostream>
#include <bitset>
using namespace std;
int main(){
char a = 'A';
char b = 'a';
cout << "输出大写字符A的ASCLL码:" << (int)a << endl;
cout << "输出小写字符a的ASCLL码:" << (int)b << endl;
}
利用数组存储高精度数据
#include <iostream>
#include <bitset>
using namespace std;
int main(){
char a[100];
int b[100] = {0};
cin >> a;
for (int i = 0;a[i];i++){ //将字符转换为数字
b[i] = a[i] - 48;
}
for (int i = 0;b[i];i++){
cout << b[i];
}
}
在很多时候,如果存储的数据大于数据类型能够存储的最大数据,可以使用数组来进行存储
答案
数据在计算机中的几种编码表示
原码:数据直接转换成二进制表示
25 → 0001 1001
反码:数据直接转换成二进制取反的结果
0001 1001 → 1110 0110
正数的反码就是真值本身;负数的反码,只须对符号位以外各位按位“求反”
负数在计算机当中用补码表示
补码:将原码取反加1,得到补码结果
0001 1001 → 1110 0111
#include <iostream>
#include <bitset>
using namespace std;
int main(){
cout << bitset<8>(-2) << endl; //负数在计算机当中用补码表示
}
正数的反码就是真值本身;负数的反码,对符号位以外的各位按位“求反”
0在计算机中的表示
[+0]原
= 000000...00
[+0]反
= 000000...00
[+0]补
= 000000...00
[-0]原
= 100000...00
[-0]反
= 111111...11
[-0]补
= 000000...00
0的原码和反码表示都不唯一
而补码表示是唯一的
位逻辑运算
二进制与二进制数据之间的运算称为位运算
名称 | 符号 | 意义 |
---|---|---|
位与 | & | 两边同时为1,才为1 |
位或 | | | 只要有一边为1,结果就为1 |
位非 | ~ | 如果是1,结果为0,反之亦然 |
异或 | ^ | 相同为0,不同为 |
#include <iostream>
using namespace std;
int main(){
int a = 5;
int b = 6;
cout << (a & b) << endl; //进行位与运算,输出的结果为十进制
cout << (a | b) << endl; //进行位或运算,输出的结果为十进制
cout << (~a) << endl; //进行非a运算,输出的结果为十进制
cout << (a^b) << endl; //进行异或运算,输出的结果为十进制
return 0;
}
输出实践案例
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
if (n & 1){
cout << "奇数" << endl;
}else{
cout << "偶数" << endl;
}
}
利用位运算来判断奇偶
1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均出现一次,请设计一个算法,将重复数字找出来
#include <iostream>
using namespace std;
int main(){
int a[1001] ={0};
int b[1000] ={0};
int result = 0;
for (int i = 0 ;i<1000;i++){ //赋值元素
a[i] = i;
b[i] = i;
}
a[1000] = 5; //设置重复数据
for (int i = 0;i<1000;i++){ //异或出结果
result ^= (a[i]^ b[i] );
}
result ^= a[1000];
cout << result << endl; //输出答案
}
一个数组中除了某一个数字之外,其他数字都成对出现,请设计一个程序,找出这个只出现一次的数
#include <iostream>
using namespace std;
int main(){
int a[1001] ={0};
int result ;
for (int i = 0 ;i< 1000;i+=2){ //生成数据
a[i] = i;
a[i+1] = i;
}
a[1000] = 6;
//进行计算
for (int i = 0;i < 1001;i++){
result ^= a[i];
}
cout << result << endl;
}
输入一个数,请判断这个数据是否是一个2的整数次方(不考虑负数)
分析:当一个数是2的整数次方,那么它的二进制只有一个1
如果是一个2的整数次方,那么这个数据n和(n-1)做位与运算,结果必为0
分析
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
if ((n & (n - 1)) == 0){
cout << "yes" << endl;
}else{
cout << "no" << endl;
}
}
移位运算
>>和<<运算符用于将二进制位进行右移或者左移
>>运算符用符号位填充高位
#include <iostream>
using namespace std;
int main(){
int a = 8;
cout << (a << 1) << endl;
cout << (a << 2) << endl;
cout << (a >> 1) << endl;
cout << (a >> 2) << endl;
}
请实现一个函数,输入一个整数,输出该数二进制表示中有多少个1
输入:9
输出:2
#include <iostream>
using namespace std;
int main(){
int n;
int a = 1;
int count = 0 ;
cin >> n;
for (int i = 0 ;i< 32;i++){
if ((a & n) == a){
count ++;
}
a = a << 1;
}
cout << count << endl;
}
将整数的二进制编码奇偶位互换
输入:6
输出:9
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int c = n & (0x55555555); //保留奇数位
int d = n & (0xAAAAAAAA); //保留偶数位
//将奇数左移一位,将偶数右移一位,得到最后结果
cout << ((c << 1) ^ (d >> 1)) << endl;
}
Level2_3_进制及编码表示
By yang he
Level2_3_进制及编码表示
- 296