------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、进制中的转换
#include
#include
void main()
{
//定义一个int类型的数字13,分别打印出8进制和16进制的数
int num=13;
printf("%o\n",num); //15
printf("%x\n",num); //d
//将2进制的数据转换为10进制
printf("%d\n",0b0101); //5
//将16进制的数据转换为10进制
printf("%d\n",0xd); //13
//将8进制的数据转换为10进制
printf("%d\n",015); //13
}
二、进制转换的要素
基数:是几进制基数就是几。
位权:位权=数码*基数^数位次方
三、10进制和2进制互相转换
转换方法:整数部分采取“除2取余法”,小数部分采取“乘2取整法”,高位补0,将得到的余数倒叙得到的序列就是二进制表示形式。
(1)例如:将10进制的97转换为2进制的数据
(2)例如:将2进制的0b0011转换为10进制的数据
2*1^0+2*1^1=3
四、2进制和16进制互相转换
2进制->16进制转换方法:整数部分从右向左并一位,小数部分从左向右并一位
16进制->2进制转换方法:1位拆4位
实例2:
将一个16进制常量转换为2进制方法
16进制常量为0x520A
5 ---> 0101
2 ---> 0010
0 ---> 0000
A ---> 1010
2进制就为:0101 0010 0000 1010
如果拆完之后位数不够,高位补0.
五、原码、反码、补码
1、概念及使用
数据在计算机内部是以补码的形式存储的。
(1)原码:原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。
(2)反码:正数的反码是其本身。负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
(3)补码:正数的补码是其本身。负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1
综上:
[+1] = [00000001] 原码 = [00000001] 反码 = [00000001] 补码
[-1] = [10000001] 原码 = [11111110] 反码 = [11111111] 补码
64位机器下:
int 类型占用4个字节,每个字节8位
计算机存储1使用32位的二进制数码,存储的是补码。
(1)+1 存储的是补码
原码:00000000000000000000000000000001
反码:原码
补码:原码
(2)-1存储的是补码
原码:10000000000000000000000000000001
反码:11111111111111111111111111111110
补码:11111111111111111111111111111111
2、为什么引入反码、补码?
计算机能够做减法。
六、位运算符
1、&按位与:如果两个位进行&操作,同1则结果为1,有0即为0
2、| 按位或:如果两个位进行 | 操作,有1则为1,同0即为0
3、~ 按位取反:1变0,0变1如:~9
4、^ 按位异或:相同为0,不同为1
5、左移<<:各二进位全部左移n位,高位丢弃,低位补0
例如:8<<2 相当于8*2^n的次方
注意:左移位会改变一个数的正负性
用途:快速计算一个数 * 2的n次方
6、右移>>:移动出去的位舍弃,高位补符号位
例如:8>>2 相当于8/2^n的次方
注意:右移位不会改变一个数的正负性
用途:快速计算一个数 / 2的n次方
7、位运算技巧
任何数和1进行&操作,得到这个数的最低位,然后判断奇偶性
#include
#include
void main()
{
//奇数
int a=5;
printf("最低位是:%d",a&1); //1
//偶数
int a=6;
printf("最低位是:%d",a&1); //0
printf("如果是1就是奇数,如果是0就是偶数");
}
七、练习:将一个10进制的数用二进制的形式打印出来。
#include
#include
void main()
{
int num=13;
int len=sizeof(int)*8;
int r1,r2,r3;
for(int i=len-1;i>=0;i--){
r1=num>>i;
r2=r1&1;
printf("%d",r2);
}
}
解析:
13的二进制表示形式是:00000000000000000000000000001101
1的二进制表示形式是 :00000000000000000000000000000001
让13的二进制数从左到右依次与1的二进制最后一位做&,得到的就是13的二进制表现形式
← 逐个向左移动
00000000000000000000000000001101
00000000000000000000000000000001
逐个打印的出的还是:00000000000000000000000000001101