如何在Java中使用位运算?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
java位运算可以分为左移和右移,其中右移还有无符号右移。
java只对整型位移,可以分为int体系和long体系。int体系包括(byte, short, int, char),long体系只包含long。int体系中进行位运算时,除int类型外都会先转换为int再进行运算。.
无符号右移指的是,向右移动时,左边补位的是0。
一般来说,右移左移常用作乘2n 或者除以2n。(右移除以2n,左移乘以2n)
int i1 = 4; int r1 = i1 >> 2; // 除以2^2 int r2 = i1 << 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位整型,反码可以表示的范围为:[-128,127]
-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 << 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 << 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, 2147483647],下面对上下界分别进行测试:
// 边界值测试: int imax = Integer.MAX_VALUE; // 21_4748_3647 = 0111_1111_1111_1111_1111_1111_1111_1111 (2^31-1) 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 << 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 << 1; // 0000_0000_0000_0000_0000_0000_0000_0000 = 0 System.out.println(r7); // 实际:0
1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,Java是面向网络的语言;4. 鲁棒性,java提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。;5. 安全性,用于网络、分布环境下的Java必须防止病毒的入侵。6. 体系结构中立,只要安装了Java运行时系统,就可在任意处理器上运行。7. 可移植性,Java可以方便地移植到网络上的不同机器。8.解释执行,Java解释器直接对Java字节码进行解释执行。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。