如何在Java中使用位运算吗?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
一位运算的分类与展现效果
Java位运算可以分为左移和右移,其中右移还有无符号右移。
int i1 =, 4,, int r1 =, i1 在祝辞,2,,//,除以2 ^ 2 int r2 =, i1 & lt; & lt;, 2,,//,乘以2 ^ 2 System.out.println (r1);//, 1 System.out.println (r2);,//, 16
二,原理
位运算实际上是将数值对应的二进制进行左右位移操作. java中数值的存储、运算是以补码的形式进行的。数值有三种存储方式:原码,反码,补码。
原码的最高位为符号位(0为正数,1为负数),其余位用于存储数值,以8位整型为例,2对应:
0000, 0010
2对应:
1000, 0010
? ?反码和补码的正数都与原码相同。反码的负数在原码的基础上进行,除符号位外,其余按位取反,例如2的反码为:
0000, 0010(正数不变)
2的反码为:
1111, 1101
补码在反码的基础上进行,反码加1就变成补码。
2:
0000, 0010(正数不变)
2为:
1111, 1110
8位整型,反码可以表示的范围为:[-128127]
-128年的反码表示为:
1000, 0000
可以理解为:
1, 1000年,0000年(原),=祝辞,1,0111,1111(反),=祝辞,1,1000,0000(补),=祝辞,1000,0000(补)
(查看了一些解释,-128的补码规定为1000 0000,若不理解,可以先跳过)。
左移即是补码向左移动,右边空出的用0补位,右移就是向右动,左边空出来的以符号位补位。(无符号右移,左边空出来的以0补位)。下面以具体代码举例(int为32位):
正数:
int i1 =, 4,,//, 0000, 0000, 0000, 0000, 0000, 0000, 0000, 0100 int r1 =, i1 在祝辞,2,,//,期望,0000,0000,0000,0000,0000,0000,0000,0001,=,1 int r2 =, i1 & lt; & lt;, 2,,//,期望,0000,0000,0000,0000,0000,0000,0001,0000,=,16岁 System.out.println (r1);,//,实际:1 System.out.println (r2);,//,实际:16
负数:
int i2 =, 4,,//, 1111, 1111, 1111, 1111, _ , 1111, 1111, 1111, 1100 int r3 =, i2 在祝辞,2,,//,期望:1111,1111,1111,1111,_ , 1111, 1111, 1111, 1111,=, 1 int r4 =, i2 & lt; & lt;, 2,,//,期望:1111,1111,1111,1111,_ , 1111, 1111, 1111, 0000,=-16 int rx =, i2 在祝辞祝辞,1,,//,期望:,0111,1111,1111,1111,_ , 1111, 1111, 1111, 1110,=, 2147483646 System.out.println (rx);,//,实际:2147483646 System.out.println (r3);,//,实际:1 System.out.println (r4);,//,实际:-16
rx记录无符号右移结果,移动后左边补位以0补满,于是结果就变成了2147483646
三,边界值测试
int类型的范围为(-2147483648,-2147483648),下面对上下界分别进行测试:
//,边界值测试: int imax =, Integer.MAX_VALUE;,//, 21 _4748_3647 =, 0111 _1111_1111_1111_1111_1111_1111_1111 (2 ^还有) int r5 ,=, imax 在祝辞,2,,//,0001 _1111_1111_1111_1111_1111_1111_1111 =,(2 ^ 30,安康;1),5 _3687_0911=, System.out.println (r5);//,实际:5 _3687_0911 int r6 =, max & lt; & lt;, 2,,//, 1111 _1111_1111_1111_1111_1111_1111_1100 (补码形式,),=4 System.out.println (r6);//,实际:4 int imin =, Integer.MIN_VALUE;//-21 _4748_3648=1000 _0000_0000_0000_0000_0000_0000_0000 int r7 =, imin & lt; & lt,, 1,,//, 0000 _0000_0000_0000_0000_0000_0000_0000 =0 System.out.println (r7);,//,实际:0
Java的优点是什么
1。简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2。面向对象;3。分布性,Java是面向网络的语言;4。鲁棒性、java提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。5。安全性,用于网络,分布环境下的Java必须防止病毒的入侵。6。体系结构中立,只要安装了Java运行时系统,就可在任意处理器上运行。7。可移植性、Java可以方便地移植到网络上的不同机器。8。解释执行,Java解释器直接对Java字节码进行解释执行。