多种进制转换方法,原码、反码、补码计算与转换,位运算符的使用方法,函数简介

目录

进制转换:

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

        十进制转二进制:(转其他进制)

                二进制转十进制

                二进制转八进制

                二进制转十六进制

原码、反码、补码:

        原码:

        反码:

        补码:

        补码转数据:

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

        A & B   按位相与

        A | B   按位相或

        ~A          按位求反

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

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

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

函数:

        函数分类:

                标准库函数:

                系统函数:(不是函数)

                第三方库函数:

                自定义函数:

        函数声明:

                                隐式声明:

        函数定义:

        函数调用:


进制转换:

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

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

                二进制虽然可以直接被CPU识别计算,但是不方便书写、记录,

                        所以把二进制数据转换成八进制是为了方便记录到文档中

                随着CPU的不断发展,位数不停增加,由早期的8位逐渐发展到现在的64位,

                        因此八进制不再能满足需求,所以发展出了十六进制。由于历史原因,八进制还不能完全地退出历史舞台。

        十进制转二进制:(转其他进制)

                求余法:用2对数据求余,记录余数,然后继续对商求余,直到商为0结束,过程产生的余数就是该数据的二进制(逆序)

                        n % 2 = 0 | 1

                        商 % 2 = 0 | 1

                        直到商为0

                                127 % 2         1

                                63 % 2          1

                                31 % 2          1

                                15 % 2          1

                                7 % 2           1

                                3 % 2           1

                                1 % 2           1

                                0                   0 ↑

                                127 → 01111111

                求权法:从高位到低位,数据 - 2^(n-1) ,如果能减,第n位就是1,否则就是0

                        137

                        128 64 32 16 8 4 2 1

                            1   0   0   0 1 0 0 1

                                137→10001001

                手算:

                        79 →1001111

                        63 →111111

                        121 →1111001

                        49 →110001

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

                二进制转十进制

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

                        10011010        

                        128+16+8+2 = 154

                

                二进制转八进制

                        低位起:每三位二进制对应一位八进制

                        二进制:1 001 101 110 010

                        八进制:1   1   5   6   2

                二进制转十六进制

                        低位起:每四位二进制对应一位十六进制

                        二进制:  1 1011 0111 1010

                        十六进制:1        B        7        A

        C语言中:以0开头的数据都是八进制,以0x开头的数据都是十六进制

                %o 以八进制形式显示数据

                %x 以十六进制形式显示数据

                %#o %#x 以对应格式显示不同进制

原码、反码、补码:

        原码:

                数据的二进制 -10 10001010

        反码:

                正数的反码就是原码

                负数的反码是原码除符号位外,其他位按位求反 

                -10 11110101

        补码:

                所有的数据在内存中都是以补码形式存储

                正数的补码就是原码

                负数的补码:

                        1、先转成二进制原码

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

                        3、反码+1得到补码

                -127

                1111 1111   原码

                1000 0000   反码

                1000 0001   补码

                0x81

                %hd 0000 0000 1000 0001 == 129

        补码转数据:

                无符号补码直接转换成十进制

                有符号最高位是0,说明是正数,也直接转换成十进制

                有符号且最高位是1:

                        1、补码-1得到反码

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

                        3、原码转换成十进制

                1111 1111 补码

                1111 1110 反码

                1000 0001 原码

                -1                十进制

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

        A & B   按位相与

        10101101        A 

        01101110        B 

        00101100        A & B

        A | B   按位相或

        10101101        A 

        01101110        B 

        11101111        A | B

        ~A          按位求反

        10101101        A 

        01010010        ~A

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

        10101101        A 

        01101110        B 

        11000011        A ^ B

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

        10101101        A

        10101101 << 4

        1010 11010000

        11010000        A << 4

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

        10101101        A

        10101101 >> 4

        11111010 1101

        11111010        A >> 4

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

        思考题:输入两个整数,把A的4 ~ 7位设置为B的3 ~ 6位,其他位不变

函数:

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

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

        函数分类:

                标准库函数:

                        C语言标准管理委员会为C语言以函数形式提供的一套功能,被封装在libc.so库中,

                                使用时需要包含头文件,函数名(参数)即可调用标准库函数

                        int atoi(const char *nptr);

                        long atol(const char *nptr);

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

                        #include <ctype.h>

                        c为ASCII码值

                        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 <sidlib.h>

                        int abs(int j);

                        功能:求j的绝对值

                        int system(const char *command);

                        功能:调用系统命令

                        int rand(void);

                        功能:返回一个随机整数

                        int srand(unsigned in seed);

                        功能:随机种子

                        

                        以下函数被封装在libm.so库中 -lm

                        #include <math.h>

                        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 到当前时间过了多少秒

        练习3:获取10个范围[100,1001)的随机数

        练习4:随机出一注双色球彩票号码

                        6个红球 1-33 不能重复 

                        1个篮球 1-16

                        

                系统函数:(不是函数)

                        是操作系统以函数接口形式提供的一套功能,这些功能:

                                内存管理、信号处理、文件IO、文件管理、进程管理、进程通信、线程管理、线程同步、网络通信

                第三方库函数:

                        由第三方提供的,一些开源的或者收费的代码

                        MD5         验证

                        JSON        序列化、反序列化

                        glog        日志记录

                自定义函数:

                        为了更好地管理代码,减少冗余把代码封装成函数

                        注意:一个函数尽量控制在50行以内,一个函数一个功能

        函数声明:

                                函数声明目的是为了告诉其他代码该函数调用格式

                                返回值类型 函数名(类型1 形参1, 类型2 形参2, ...);

                                        1、C语言中函数名全部小写,用下划线分隔,不能有数字

                                        2、如果不需要参数时,建议写void,不要空着

                                        3、如果不需要返回值,函数类型写void,但是return后不能跟数据

                                隐式声明:

                                        当调用函数之前没有声明和定义,C89编译器会猜测函数的格式,

                                        参数列表会根据调用时提供的实参(数据)来猜测,返回值会猜测成int类型

                                        C99中只要使用了隐式声明就会警告

                                注意:函数定义如果在函数调用之前,可以省略函数声明

        函数定义:

                                返回值类型 函数名(类型1 形参1, 类型2 形参2, ...)

                                {

                                        函数体

                                        return val;

                                }

        函数调用:

                                函数名(实参1, 实参2, ...);

                                注意:返回值会放在调用的位置,可以立即打印显示,或者也可以用变量记录下来

作业:

        1、实现一个函数,判断整数是否是素数,调用该函数显示出100 ~ 10000之间的所有素数

        2、输入两个日期,计算两个日期之间间隔了多少天

        3、实现一个函数,判断整数是否是回文数,调用该函数显示出1亿-10亿间的所有回文数

        4、计算出100的阶乘

        5、输入一个整数,显示该整数的补码


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值