从零开始 学习C/C++的第八天 进制转换和常用函数

本文介绍了计算机中为何使用二进制、八进制和十六进制的原因,以及如何进行十进制与这些进制之间的转换。详细阐述了二进制转十进制、八进制和十六进制的方法,并提到了位运算符的作用。同时,讲解了原码、反码和补码的概念及其在计算机内存中的存储方式。最后,通过两个实例展示了如何在C语言中实现特定的位操作和函数调用。
摘要由CSDN通过智能技术生成

进制转换 11.8

进制转换:

    为什么要使用二进制,八进制,十六进制:

        因为现在的cpu只能识别高低两种电平,只能对二进制的数据进行计算

        二进制数据虽然可以被计算机识别计算,但是不方便书写,记录,把二进制的数据转换成八进制为了方便把数据记录在文件中

        由于cpu的位数不断增加,由早期的8位逐渐增加到现在的64位,因此8进制不再符合需求了,所以才发展出了16进制,由于历史原因,八进制还不能退出历史舞台

    十进制转二进制:

        求余法:用数据不断对2求余,然后再拿商继续求余,直到商为0结束,过程中产生的余数的逆序就是该数据的二进制

        127 % 2     1

        63  % 2     1    

        31  % 2     1

        15  % 2     1

        7   % 2     1

        3   % 2     1

        1   % 2     1

        0           0

    求权法:  数据 - 2^(N-1),如果可以减,则第N位是1,否则是0

    1 2 4 8 16 32 64 128.... 137

    128 64 32 16 8 4 2 1

    48,79,121,93

    00110000,01001111,01111001,01011101

    练习1:输入两个正整数m,n,显示出m的n进制(n>=2),超过10用字母表示 10 A    11 B    12  C

    二进制转十进制:

        数据的每位的2^(n-1),求和

        10011001 = 128+16+8+1 = 153

    二进制转八进制:

        三位二进制位对应一位八进制位

        10 011 100 110 101

        2   3   4   6   5

    二进制转十六进制:

        四位二进制位对应以为十六进制位

        0010 0111 1011 0101

        2     7   b   5

    注意:在C语言代码中,以0开头的都是八进制数据,一0x开头的是十六进制数据

        %o  以八进制打印数据

        %x  以十六进制打印数据

        %#o     %#x     可以让数据以对应的进制格式显示

    原码,反码,补码:

    原码:数据的二进制

    反码:

        正数的反码就是原码

        负数的反码等于原码除符号位外,其它位按位求反

        -10     10001010

                11110101

    补码:  数据在计算机内存中是以补码形式存储的

        正数的补码就是它的原码

        负数的补码等于它的反码+1

            1.数据直接转成二进制原码

            2.除符号位外,按位求反,得到反码

            3.反码+1,得到补码

        -127

        1111 1111   原码

        1000 0000   反码

        1000 0001   补码

    补码转数据:

        无符号数据:直接转成十进制

        有符号数据:

            判断最高位是0,直接转成十进制

            判断最高位是1:

                1.补码-1得到反码

                2.符号位不变,其它位按位求反得到原码

                3.原码转换成十进制

        1111 1111   有符号补码

        1111 1110   反码

        1000 0001   原码    -1

位运算符: &    |   ~   ^   <<  >>

    A & B   按位相与

        1001 1101   0x9D

        1101 0001   0xD1

        1001 0001   0x91

    A | B   按位相或

        1001 1101   0x9D

        1101 0001   0xD1

        1101 1101   0xDD

    ~a      按位求反

        1001 1101   0x9D

        0110 0010   0x62

    A ^ B   按位异或    (相同为0,相异为1)

        1001 1101   0x9D

        1101 0001   0xD1

        0100 1100  

    A << n  把A的补码向左移动n位,左边丢弃,右边补0

        1001 1101 << 3

        1110 1000

    A >> n  把A的补码向右移n位,右边丢弃,左边补符号位

        1000 0100 >> 2

        1110 0001

    练习2:输入一个整数,把它的4~7位设置为1010,其它位保持不变

函数:

    一段具有某项功能的代码段,是C语言中管理代码的最小单位

    把代码封装成一个一个函数,可以方便管理和调用代码

    函数分类:

        标准库函数:

            C语言标准委员会为C语言以函数形式提供一套常用的基础功能,被封装在libc.so,libm.so库中,使用时需要提供头文件,通过函数名(参数)就可以调用该函数

            int atoi(const char *nptr);

            long atoi(const char *nptr);

            long long atoll(const char *nptr);

            功能:把字符串转换成整数

            #include <ctype.h>

            int isalnum(int c);     功能:判断c是不是数字、字母字符

            int isalpha(int c);     功能:判断c是不是字母字符

            int isdigit(int c);     功能:判断c是不是数字字符

            int islower(int c);     功能:当c是小写字母字符时返回真

            int isupper(int c);     功能:当c是大写字母字符时返回真

            int toupper(int c);     功能:把字符转换成大写字符

            int tolower(int c);     功能:把字符转换成小写字符

            #include<stdlib.h>

            int abs(int j);

            功能:返回j的绝对值

            以下函数被封装在libm.so库中 <math.h> -lm

            double pow(double x, double y);     功能:求x的y次幂

            double fabs(double x);              功能:求浮点型数据的绝对值

            double sqrt(double x);              功能:返回x的平方根

            double floor(double x);             功能:返回小于等于x的最大整数

            double ceil(double x);              功能:返回大于等于x的最小整数

            #include <time.h>

            time_t time(time_t *t);

            功能:返回自1970-1-1 0:0:0 到当前时间过了多少秒     time(NULL)

            #include <stdlib.h>

            int system(const char *command);    功能:调用系统命令

            int rand(void);                     功能:返回一个随机整数

            void srand(unsigned int seed);      功能:种随机种子

作业1:

    获取10个[100,1000]随机数

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc,const char* argv[])
{
    int num=0,a[10]={0};
    srand(time(NULL));
    for (int i=0;i<10;i++)
    {
        a[i]=(rand()%((1000+1)-100)+100);
        printf ("%d ",a[i]);
    }
}

作业2:

    随机出一注双色球的中奖号码

    红球6个:1~33   不能重复

    蓝球1个:1~16

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main(int argc,const char* argv[])
{
    int a[6],i=0,num=0,flag=0;
    srand(time(NULL));
    while(i<6)
    {
        num = rand()%((33+1)-1)+1;
        for(int j=0;j<i;j++)
        {
            if (a[j] == num)
            {
                flag = 1;
                break;
            }
        }
        if (flag == 0)
        {
            a[i] = num;
            printf ("%d ",a[i]);
            i++;
        }
        flag = 0;
    }
    printf ("%d\n",rand()%((16+1)-1)+1);
}


 

        系统函数

        第三方库函数

        自定义函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值