进制分类

进制的转换

十进制转二进制

利用短除法进行转换

十进制转八进制

利用短除法进行转换

十进制转十六进制

利用短除法进行转换

练习

请尝试将以下数字转换为二进制、八进制、十六进制

十进制 二进制 八进制 十六进制
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;	
}
Made with Slides.com