Java进阶——计算机数据的进制特点与转换及位运算小结

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/CrazyMo_/article/details/90740249

引言

二进制数据或许对于很多程序员来说既陌生又熟悉,熟悉的是都知道计算机是以二进制存储所有数据的这么一个概念,陌生的是对于一些进制之间的转换原理和位运算的方面知识,再加上平时的工作中很少直接使用到,不过个人认为这些都是必须要掌握的知识,尤其是在涉及到算法方面的时候,这些基础尤为重要,举个例子在进行整型运算时性能最高的就是位运算,不要小看这点性能提升,尤其是在硬件条件较为苛刻的时候极为重要,比如说嵌入式开发。

一、进制的种类

进制是学习计算机语言最基本的知识,计算机中进制类似于我们日常生活中的一分钟六十秒,逢六十进一,就是六十进制;一天二十四小时,逢二十四进一,就是二十四进制;一星期七天,逢七进一,就是七进制;一年十二个月,逢十二进一,就是十二进制等等。所以,N进制就是逢 N进一。而计算机有四种进制表现形式:二进制八进制十进制十六进制,而Java中对整数表现形式有三种八进制十进制十六进制

1、二进制

二进制只有两个元素:0和1任何数据在计算机都是以二进制的形式存在的(还记得《骇客帝国》里那一串0101010101吧),换言之一切数据的本质都是由0和1组成的。因为二进制是由电信号的开关演变而来的(开关只有两个状态:开和闭),后来就在内存使用0、1代表电信号的开关状态,并且约定了8位表示1个字节(相当于是每个字节由8个开关状态表示),接着老外为了更直观的让计算机快速识别出他们的字母和相关符号,研究编制出ASCII码表指定了个各字母字符对应的进制数据(计算机识别中文也是通过我们中文的汉字编码表)

2、八进制

虽然已经有了二进制表示数据,但是用二进制表示数据就得使用一长串的1或0,可读性不太好,于是科学家就想把原始的二进制串缩短些——将原来二进制串的三位变成用1位表示,而三位的二进制最大值是7,即逢8就进1,于是八进制应运而生,八进制有八个元素:0、1、2、3、4、5、6、7,在程序中使用0开头表示,如int k=012。
在这里插入图片描述

3、十六进制

与八进制的初衷一样也是为了缩短二进制串,将原来二进制串的四位变成用1位表示,而4位的二进制最大值是15,即逢16就进1,于是十六进制应运而生,十六进制有十六个元素:0、1、2、3、4、5、6、7、8、9、A、B、C、D、F(不区分字母大小写),在程序中使用0x开头表示,如int k=0x12。
在这里插入图片描述
三十二进制也是类似。

二、进制的转换

1、十进制整数转为二进制整数

十进制整数转为二进制整数原理就是除2取余,逆序排列其他进制数从上往下进行除以2运算,整除取0,反之取1,一直运算直到商为1,最后对余数从下往上按照高到低位排列。以十进制转为二进制为例:
在这里插入图片描述
十进制转为8进制就是除以8取余,58的八进制为072;十六进制则是除以16取余,58的十六进制为0x3A。

2、十进制小数转为二进制小数

十进制小数转换成二进制小数原理是乘2取整,顺序排列:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。 然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。如果小数中整数部分大于0则分开计算再合并。
在这里插入图片描述
而2.8125的二进制小数表示则为10.1101,因为十进制2的二进制数为10,而0.8125的二进制数为0.1101,由于有些小数的二进制数长度可能是无限的。

3、二进制转为十进制

二进制转为十进制原理就是按权相加法:整数部分要从右到左用二进制的每个数去乘以2的相应次方,而小数点后则是从左往右,需要注意的是十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并
在这里插入图片描述

4、其他进制的转换

其他进制转换都可以先转为二进制再进行计算。
在这里插入图片描述

5、负数的二进制表示

负数的二进制表示本质就是,正数的二进制取反再加1的结果
在这里插入图片描述

三、进制的算术运算

进制的运算其实和我们小学学的十进制算术运算没有本质区别,仅仅是在于逢几进1的区别。
在这里插入图片描述
其他减乘除也是类似的。

四、二进制的位运算

1、常见的位运算符

位运算是直接对二进制进行运算的,所以做位运算也很简单,先转为二进制再计算,常见的位运算符有

运算符 说明
<< 按位左移,结果是相当于乘以2的N次幂,即左移N位,3>>2=12 -->322,具体操作是把二进制串整体向左移动N位,相当于是左边高位的对应位数被截断,右边低位再补上对应位数的0,即左移截高位补低位
>> 按位右移,结果是相当于除以2的N次幂,(对整数进行右移得到最终结果还是整数,会自动取整)具体操作是把二进制串整体向右移动N位,相当于是右边低位的对应位数被截断,左边高位再补上对应位数的0或者1(由源串的最高位决定,最高位为1则补1,为0则补0),即右移截低位补高位
>>> 按位无符号右移,右移后都用0来补高位
& 按位与运算,同1(true)才得1(true)无论左边是true还是false,右边都运算,而&&当左边为false是右边不进行计算
I 按位或运算,有1则得1两边都参与运算,而II 当左边为true右边不计算了
^ 按位异或运算,相同得0,不同得1,1 ^ 1=0,0 ^ 0=0,1 ^ 0=1,0^1=1,7 ^ n ^n=7,N ^ 0=N,可以用于简单的加密。
~ 取反,按位取反

在这里插入图片描述

2、位运算的简单应用

  • 以性能最高的方式计算2*8的值
System.out.print(2<<3);
  • 以性能最高的方式交互两个整数X、Y的值
	static void swapInt(int x,int y){
		x=x^y;
		y=x^y;//(x^y)^y=x
		x=x^y;
		System.out.println(x+","+y);
	}
    /*
	static void swapInt2(int x,int y){
		x=x+y;
		y=x-y;
		x=x-y;
		System.out.println(x+","+y);
	}*/

附录Java的运算符优先级列表:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CrazyMo_/article/details/90740249
今日推荐