【趣学程序】进制之间的转换与计算

2019-07-27 18:29:24 浏览数 (2)

今天填补之前埋下的坑,首先介绍进制之间的转换,其次讨论一下 & ^ | 的计算

概念(摘抄自维基百科)

进制

进位制是一种记数方式,亦称进位计数法或位值计数法。利用这种记数法,可以使用有限种数字符号来表示所有的数值。一种进位制中可以使用的数字符号的数目称为这种进位制的基数或底数。若一个进位制的基数为n,即可称之为n进位制,简称n进制。现在最常用的进位制是十进制,这种进位制通常使用10个阿拉伯数字(即0-9)进行记数。

二进制

二进制(binary)在数学和数字电路中指以2为基数的记数系统,以2为基数代表系统是二进位制的。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示。

八进制

八进制是以8为底的进位制,使用数字0、1、2、3、4、5、6、7。

十进制

十进制是以10为基础数字系统, 是在世界上应用最广泛的进位制。

十六进制

十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F表示,其中:A~F相当于十进制的10~15,这些称作十六进制数字。

java程序中如何表示
代码语言:javascript复制
public class NumberDemo {
    public static void main(String[] args) {        System.out.println("十进制直接书写数字即可:"   10);        System.out.println("二进制的数字使用0B开头:"   0B10);        System.out.println("八进制的数字使用数字0开头:"   011);        System.out.println("十六进制的数字使用0X开头:"   0X11);
        /*        输出结果为:        十进制直接书写数字即可:10        二进制的数字使用0B开头:2        八进制的数字使用数字0开头:9        十六进制的数字使用0X开头:17         */
    }

}

进制间向十进制转化

二进制转为十进制:
  • 二进制数: 1010
  • 十进制:

二进制只有01俩个数字组成部分。 计算方法: 将二进制从右侧开始计算:分别是

与数位上的0或者1相乘然后结果相加即可

八进制转为十进制:
  • 八进制数: 6754
  • 十进制:

八进制由0-7八个数字组成部分。 计算方法: 将八进制从右侧开始计算:分别是

与数位上的 数值 相乘然后结果相加即可

十六进制转为十进制:
  • 十六进制数: 1A F5
  • 十进制:

十六进制由0-9 A-F十六个数字组成部分。 计算方法: 将十六进制从右侧开始计算:分别是

与数位上的 数值 相乘然后结果相加即可

十进制向其他进制转化

十进制转为二进制:
  • 使用短除法
代码语言:javascript复制
将十进制15转为二进制数                        余数    15 / 2 = 7  ………………   1    7 / 2 = 3  …………………   1    3 / 2 = 1 ……………………   1    1 / 2 = 0 ……………………   1

将余数倒置:    1111 就是二级制的15

将十进制10转为二进制数                        余数    10 / 2 = 5  ………………   0    5 / 2 = 2  …………………   1    2 / 2 = 1 ……………………   0    1 / 2 = 0 ……………………   1

将余数倒置:    1010 就是二级制的10
十进制转为八进制:
  • 使用短除法
代码语言:javascript复制
将十进制15转为八进制数                        余数    15 / 8 = 1  ………………   7    1 / 8 = 0  …………………   1
将余数倒置:    17 就是八级制的15
十进制转为十六进制:
  • 使用短除法
代码语言:javascript复制
将十进制6901转为十六进制数                            余数    6901 / 16 = 431  ………………   5    431 / 16 = 26  ……………………   F    26 / 16 = 1  …………………………   A    1 / 16 = 0  ……………………………   1
将余数倒置:    1AF5 就是十六级制的6901

^ & | >> << 运算符

代码语言:javascript复制
十进制运算:
public class NumAndOrDemo {
    public static void main(String[] args) {        //与运算        System.out.println(7 & 9);        //或运算        System.out.println(2 | 5);        //异或运算        System.out.println(10 ^ 5);        //一个数字对同一个数异或两次,数值不变        System.out.println(10 ^ 5 ^ 5);
        System.out.println("-----");        //右移        System.out.println(8 >> 3);        //左移        System.out.println(2 << 3);    }

    /*    打印结果:    1    7    15    10    -----    1    16     */}
解释:
首先,这几个运算符的计算,是使用二进制进行计算的,计算完成之后再重新转为10进制;

& 同位数字相同则为1,否则为0
7 & 9  = 1二进制的 7 =  0    1   1   1二进制的 9 =  1    0   0   1             0  0   0   1将0001 转为十进制为1,所以 7 & 9 = 1

| 同位数字有1则为1,全是0为0
2 | 5  = 7二进制的 2 =  0    0   1   0二进制的 5 =  0    1   0   1             0  1   1   1将0111 转为十进制为7,所以 2 | 5  = 7

^ 同位数字不同则为1,同位数字相同则为0
可以得出结论,一个数异或它本身结果为0
10 ^ 5  = 15二进制的 10 = 1    0   1   0二进制的 5 =  0    1   0   1             1  1   1   1将1111 转为十进制为15,所以 10 ^ 5  = 15

^ 同位数字不同则为1,同位数字相同则为0
10 ^ 5  ^ 5 = 10二进制的 10^5 = 1    1   1   1二进制的 5   =  0    1   0   1               1    0   1   0

将1010 转为十进制为10,所以 10 ^ 5  ^ 5 = 10
可以得出结论,一个数字对同一个数异或两次,数值不变


8 >> 3 = 1  :读法,8向右移3位
二进制 8 =    1   0   0   0右移 3 位 =  0    0   0   1
0001 转为10进制为 1
结论:任意数向右移,数值变小,右移n位,原数字除以2的n次方 取整数

2 << 3 = 16 :读法,2向左移3位
二进制 2 =    0   0   0   1   0右移 3 位 =  1    0   0   0   0
10000 转为10进制为 16
结论:任意数向左移,数值变大,左移n位,原数字乘以2的n次方 

文章中源代码分享:https://github.com/upuptop/WeChatQuXueChengXu

0 人点赞