C语言学习--进制、函数、位运算符、原反补

1、进制转换

概况了解:

为什么是二进制、八进制、十进制、十六进制?

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

虽然二进制的数据可以直接被CPU识别计算,但是不方便书写、记录,把二进制的数据转换成八进制是为了方便记录到文档中

由于CPU的发展,位数不断增加,由八位逐渐发展到现在的64位,因此八进制就不能满足需求了,所以发展出了16进制,但是由于历史原因八进制还不能完全淘汰

进制转换:

十进制转二进制:

求余法:对2求余,然后对商求余,直到商为零结束,该过程产生的余数就是该数的二进制(求余逆序)

n%2==1或0

商(n/2)%2==1或0

...直到商为零

余数的逆序就是n的二进制数

求权法

数据-2^(n-1)如果够减,那么第n位就是1,否则就是0,直到把数据减为零

求权法求137

128 64 32 16 8 4 2 1

1  0  0  0 1 0 0 1

手算86 72 112 176

86:01010110

72:01001000

112:01110000

176:10110000

练习题一:输入一个正整数m,输入n(n>=2),显示m的n进制数,超过10的用字母表示   10A 、11B  12C ..15F

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

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

例:10010010  1*2^(8-1)… 1*2^(5-1)…1*2^(2-1)...    146

二进制转八进制:

从低位开始,每三位二进制位对应一位八进制

二进制:1 001 101 010

八进制:1   1     5    2

二进制转十六进制:

从低位开始,每4位二进制位对应一位16进制

二进制:1 0010 1010 1101

十六进制:1  2  A(10)  D(13)

在C语言中,以0开头的数是八进制数,一般的为十进制,以0x开头的数是十六进制。

%o  以八进制显示数据

%x   以十六进制显示数据

%#o%#x   # 把数据对应的前缀显示出来

%c  087八进制

2、原码、反码、补码:

原码:数据的二进制

反码:

正数的反码就是它原码

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

补码:

正数补码就是它的原码

负数的补码是它的反码+1

注意:计算机内存中所有的数据的存储都是以补码形式存储的

  1. 负数转换成二进制
  2. 符号位不变,其他位按位取反,得反码
  3. 反码+1得到补码

-127

原码:1111 1111

反码:1000 0000

补码:1000 0001

补码转数据:

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

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

有符号且最高位是1:

  1. 补码-1得到反码
  2. 符号位不变,其他位按位求反得到原码
  3. 原码转换成十进制数据

3、位运算符    &  |  ~  ^  <<  >>

A&B  按位相与   全一为一

A|B 按位相或   有一出一

例:按位相或:

00110010   0x32

11001010   0xca

--------------

11111010   0xfa

~A 按位求反

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

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

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

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

00000000001111   0xf -->0xf<<4 00000011110000  --> ~(0xf<<4)111111100001111

-->num&~(0xf<<4)  --> 0000000001010000  0xA<<4  -->(num&~(0xf<<4)|(0xA<<4))

4、函数

  一段具有某项功能的代码,C语言中管理代码的最小单位是函数,把代码进行封装成函数,可以方便管理和调用代码

函数的分类:

标准库函数

由C语言标准委员会为C语言以函数的形式提供的一些基础功能,被封装libc.so库中,使用时需要包含对应的头文件,通过 函数名(实参)方式即可调用标准库中的函数

libm.so数学库

#include <time.h>

time_t time(time_t *tloc);

功能:返回自1970-1-1 0:0:0到函数执行时总共过了多少秒

time_t sec =time(null);

#include <stdlib.h>

int system(const char*command);

功能:执行系统命令

system(“clear”);

int rand(void);

功能:返回值一个随机数

int num=rand();

void srand(unsigned int seed)

种随机种子

srand(time(NULL))

练习三:获取十个【100,1000】之间的随机数,循环不超过十次

练习四:红球6组,每组1-33中抽取一个,六个互相不重复然后蓝球从1-16中抽取一个数字随机产生一组双色球号码。

系统函数

     是操作系统以函数接口形式提供的一系列功能,但是它不是真正意义上的函数

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

第三方库函数

由第三方提供的开源或者收费的代码库,例:

MD5 加密算法    

Json 序列化、反序列化

Xml 配置文件的解析算法

自定义函数

为了更好的管理自己的代码、减少代码冗余把代码封装成函数形式

函数声明:

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

隐式声明:在调用函数时,前面没有出现该函数的声明或定义,就会产生隐式声明的警告,参数会根据实参来猜测,返回值会猜测为int类型,       

反正不要产生隐式声明,只要在调用前有声明或定义即可。

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

注意:

  1. c中函数名一般全小写,下划线分隔
  2. 如果返回值不需要,则写void
  3. 如果不需要形参,建议也要写void
  4. 如果形参类型相同,每个都要加类型名

函数定义:函数的实现代码

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

{

//函数体

return (返回值类型)val(void可不加void);

}

函数调用:

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

注意:

在函数调用之前有函数定义 ,则函数声明可以省略

函数的返回值会返回在调用位置,可以选择立即显示,也可以使用变量记录下来

一个函数建议最好不要超过50行代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值