操作系统-进制
如有笔误,欢迎留言指正或讨论!
进制介绍
- 计算机内部运行各种运算时,都是以二进制的方式来运行;
二进制:0 1 满2进1
八进制:0-7 满8进1, 以数字 0 开头
十进制:0-9 满9进1
十六进制:0-9 + A-F 满16进1,0x、0X开头,A-F不区分大小写
二进制重要的三个概念
原码、反码、补码
!!!在计算机运算的时候,都是以 补码 的方式来运算的。 !!!
对于有符号的而言:
二进制的最高位是符号位:0表示正数,1表示负数
首位表示符号位 比如按照byte (字节: 8位):1 ===》[0000 0001] -1 ===》[1000 0001]
正数的原码、反码、补码都一样(三码一致)
负数的反码 = 它的原码符号位 不变,其它取反( 0->1, 1->0)
1 ===》原码[0000 0001] 反码[0000 0001] 补码[0000 0001] -1 ===》原码[1000 0001] 反码[1111 1110] 补码[1111 1111]
负数的补码 = 它的反码+1
0 的反码、补码都是 0
!!!在计算机运算的时候,都是以 补码 的方式来运算的。 !!!
位运算符
& (按位与) 当二进位同时为 1 时,结果为 1,否则为 0
2&3 2的补码 0000 0010 3的补码 0000 0011 结果 = 0000 0010 转成十进制 = 2
| (按位或) 当二进位有一个为 1时,结果为 1,否则为 0
2|3 2的补码 0000 0010 3的补码 0000 0011 结果 = 0000 0011 转成十进制 = 3
^ (按位异或) 当二进位 不同 时,结果为 1,否则为 0
2^3 2的补码 0000 0010 3的补码 0000 0011 结果 = 0000 0001 转成十进制 = 1 ---------------------------------------------------------- -2^2 题目分析: 1、计算机的运算都是按照 补码 来运算的; 2、先求出-2的 原码、反码、补码: 先求 原码,再求反码(原码符号不变,其它位取反),再求补码(反码+1) 3、3是正数 原码、反码、补码 都是一样的; 4、-2 和 3 的 补码 比较完后需要转成反码,再转原码,再在进行二进制转十进制,得出结果; -2的 原码:1000 0010 反码:1111 1101 补码:1111 1110 -2的补码:1111 1110 3的补码: 0000 0010 结果补码 = 1111 1100 结果补码 转 反码(补码+1):1111 1011 反码 转 原码(符号不变,其他取反):1000 00100 原码 转 十进制 :-4
《 (左移运算) 左边的运算数的 各二进位 全部左移n位;(左移n位就是 乘以 2的n次方)
- 符号位不变,低位补 0
//正数的三码一样 a := 1 >> 2 // 1的补码 0000 0001 右移 2 位 //
》(右移运算) 右边的运算数的 各二进位 全部右移n位;(右移n位就是 除以 2的n次方)
低位溢出,符号不变,并用符号位补溢出的高位
//正数的三码一样,溢出了
a := 1 >> 2
// 1 的补码 0000 0001 右移 2 位
//结果:0000 0000 ===》 0
//正数的三码一样
b := 1 << 2
// 1 的补码 0000 0001 左移 2 位
// 结果:0000 0100 ===》 4
其它进制 转 十进制
二进制 转 十进制
从最低位开始(最右边),每个位上的数提取出来,乘以2的(位数-1)次方,然后求和;
如:二进制:1011 (从右到左)
第一位:1 * ( 2(1-1)次方= 1 ) = 1
第二位:1 * ( 2(2-1)次方= 2 ) = 2
第三位:0 * ( 2(3-1)次方= 4 ) = 0
第四位:1 * ( 2(4-1)次方= 8 ) = 8
求十进制 = (1 + 2 + 0 + 8) = 11
八进制 转 十进制
从最低位开始(最右边),每个位上的数提取出来,乘以8的(位数-1)次方,然后求和;
注意:八进制是按 0 开头,0不参与计算!
十六进制 转 十进制
从最低位开始(最右边),每个位上的数提取出来,乘以16的(位数-1)次方,然后求和;
注意:十六进制是按 0x 开头,0x不参与计算!
如:0x33A 位数:3 3 10
0x不参与计算,其它位数参与计算,16位数(0-9,A = 10 ~ F=15 ) 按照上边的计算即可;
十进制 转 其它进制
十进制 转 二进制
将该数不断除以2,知道商为0为止,然后将每步得到的 余数倒过来 ,就是二进制;
如:十进制:56
56 / 2 = 28 0
28 / 2 = 14 0
14 / 2 = 7 0
7 / 2 = 3 1
3 / 2 = 1 1
剩余 1 1
求二进制 = 111000
十进制 转 八进制
将该数不断除以8,知道商为0为止,然后将每步得到的 余数倒过来 ,就是二进制;
注意:八进制是按 0 开头,除8的余数小于8后,在每步得到的余数倒过来前加 0;
如:156 结果 :4 3 2(余数倒叙取值为:2 3 4)
求八进制 结果前 加 0 :0234
十进制 转 十六进制
将该数不断除以16,知道商为0为止,然后将每步得到的 余数倒过来 ,就是二进制;
注意:十六进制是按 0x 开头,除16的余数小于16后,在每步得到的余数倒过来前加 0x;
如:356 结果 :4 6 1(余数倒叙取值为:1 6 4)
求十六进制 结果前 加 0x :0x164
二进制 转 八&十六进制
二进制 转 八进制
将 二进制数 每三位一组(从低位开始组合),每组转成对应的 八进制数 即可;
注意:八进制是按 0 开头,在结果前加 0;
如:二进制 11010101
101 二进制 转 八进制 = 5
010 二进制 转 八进制 = 2
11 二进制 转 八进制 = 3
求八进制 结果前加 0 = 0325
二进制 转 十六进制
将 二进制数 每四位一组(从低位开始组合),每组转成对应的 十六进制数 即可;
注意:十六进制是按 0x 开头,在结果前加 0x;
如:二进制 11010101
0101 二进制 转 十六进制 = 5
1101 二进制 转 十六进制 = 13(13 在十六进制用 D 标识(16位数(0-9,A = 10 ~ F=15 ))D
求十六进制 结果前加 0x = 0xD5
八&十六进制 转 二进制
八进制 转 二进制
将八进制数每1位,转成对应的 一个3位的二进制数 即可;
注意:八进制是按 0 开头,0不参与计算!
如:八进制:0237
7 转成一个三位的二进制数 = 111
3 转成一个三位的二进制数 = 011
2 转成一个三位的二进制数 = 10
求二进制的结果 = 10 011 111
十六进制 转 二进制
将十六进制数每1位,转成对应的 一个4位的二进制数 即可;
十六进制是按 0x 开头,0x不参与计算!
如:八进制:0237
7 转成一个四位的二进制数 = 0111
3 转成一个四位的二进制数 = 0011
2 转成一个四位的二进制数 = 0010 (最后00没有值,直接舍去)= 10
求二进制的结果 = 10 0011 0111