------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
C语言回顾-进制
一、计算机中的进制
1、什么是进制
是一种计数的方式,数值的表示形式。
2、常见的进制
十进制、二进制、八进制、十六进制。
3、进位方法
1)十进制
0~9十个数字,逢十进一
2)二进制
0和1 逢二进一
书写形式:0b或者0B开头,比如0b01 。
3)八进制
0~7八个数字 逢八进一
书写形式:数字前面加0,如045
4)十六进制
0~9十个数字加上A、B、C、D、E、F 逢十六进一
书写形式:前面加0x或者0X,如0x45
二、进制转换的要素
1、进制转换的要素
进制转换有3个基本要素:数位、基数和位权。
1)数位:数码在一个数中所处的位置。
2)基数:是几进制,基数就是几。
3)位权:某一位表示的十进制数的值。
位权=数码*基数^数位
2、常见的进制转换
1)10进制转2进制
方法:
整数部分采取“除2取余法”,小数部分采取“乘2取整法”,高位补0。
将得到的余数倒序得到的序列就是二进制表示形式。
2)二进制转十进制
二进制各位位权相加
3)二进制转十六进制
把一个二进制数,整数部分从右向左,四位合成一位,小数部分从左向右,四位合成一位。
如:
二进制:100010100101.1111
二进制:1000 1010 0101. 1111
十六进制:8 A 5 . F
4)十六进制转二进制
十六进制的每一位拆成4位二进制
三、机器数和真值
1、机器数:
一个数在计算机中的二进制表示形式,叫做这个数的机器数。
机器数是带符号的,在计算机中用一个数的最高位存放符号,正数为0,负数为1 。
2、真值
带符号的机器数对应的真正数值。
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。
四、原码、反码、补码
1、基本概念
对于一个数,计算机要使用一定的编码方式进行存储,原码、反码、补码是机器存储一个具体数字的编码方式。
数据在计算机内部是以补码的形式存储的。
数据分为有符号数和无符号数。
无符号数都是正数,有十进制直接转换成二进制直接存储。(正数的原码、反码、补码相同)
有符号数在计算机内部是以补码的形式存储的。
1)原码
原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。
2)反码
正数的反码是其本身
负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
3)补码
正数的补码是其本身。
负数的补码是在其原码的基础上,符号位不变,其余各位取反,再加1。(在反码的基础上+1)
2、-1在内存中存储细节
-1原码:1000 0000 0000 0000 0000 0000 0000 0001
-1反码:1111 1111 1111 1111 1111 1111 1111 1110
-1补码:1111 1111 1111 1111 1111 1111 1111 1111
正整数取反再+1就是对应的负数。
3、为什么要引入反码和补码?
1)引入补码,计算机能够做减法,减法的电路设计简单。
2)解决了-0的问题。
3)符号位为1,其余各位全是0表示这个字节能表示的最小的负数。
例如:一个字节
1111 1111 表示-127
1000 0000 表示-128
五、位运算符
1、位运算符介绍
位运算符是指按二进制进行的运算符。
C语言提供了6个位操作运算符。
这些位运算符只能用于整型操作数,即只能用于带符号或无符号的char、short、int与long类型。
1)& 按位与
只有对应的两个二进制位均为1是,结果位才是1,否则为0 。
口诀:同1为1 。
2)| 按位或
如果对应的两个二进制位有一个为1,则结果为1,全都是0结果是0 。
3) ~ 按位取反:
1变0,0变1 。
4) ^ 按位异或
相同为0,不同为1 。
一个数异或同一个数两次,结果不变。
5)<< 左移
各二进制位全部左移n位,高位丢弃,低位补0 。
向左移动n位,相当于原数乘以2的n次方。
左移可能会改变数的正负性。
6)>>右移
各二进制位全部右移n位,低位丢失,高位补符号位。
向右移动n位,相当于原数除以2的n次方。
右移,不会改变数的正负性。
思考&实现
写一个函数把一个十进制数按照二进制格式输出
#include <stdio.h>
void tenToTwo(int n){
int temp ;
int len = sizeof(n)*8;
for (int i =0; i<len; i++) {
temp = n;
temp = temp>>(len-1-i);
temp = temp&1;
printf("%d",temp);
}
printf("\n");
}
int main(int argc, const char * argv[]) {
tenToTwo(13);
return 0;
}
思考&实现
1)判断一个数的奇偶性
void jiOu(int n){
if (n&1) {
printf("奇数\n");
} else {
printf("偶数!\n");
}
}
2)交换两个变量的值,不通过第三个变量
用异或
void jiOu(int n){
if (n&1) {
printf("奇数\n");
} else {
printf("偶数!\n");
}
}