位运算符计算(转载)

今天看代码遇到位运算符,因为不常用已经忘记了,所以复习一下。Java位运算符包括:位与'&',位或'|',位非'~',位异或'^',右移'>>',左移'<<',右移'>>>' 。

位运算是以二进制位为单位进行的运算,其操作数和运算结果都是整型值。运算需要用到一些二进制知识,稍微回顾一下。这里有一篇介绍二进制、原码、反码和补码的文章:https://blog.csdn.net/vickyway/article/details/48788769。比较详细,这里不再赘述了。

下面代码中有具体计算过程(稍需注意的是,Java中int类型是32bit)

//java中包含运算符 = 位与'&',位或'|',位非'~',位异或'^',右移'>>',左移'<<',右移'>>>'
//参与位运算的数字都是二进制补码的方式进行按位与、或、异或,正数的反码、补码都是其本身

//1. '&' 位与运算符(两个操作数都为1,结果才为1,否则结果为0)
System.out.print("1&-3 = ");
System.out.println(1&-3);
/*计算过程(使用补码)
1: 00000000 00000000 00000000 00000001
-3: 11111111 11111111 11111111 11111101
结果: 00000000 00000000 00000000 00000001 (结果也是补码,因为是正数,原码相同) 1
*/

//2. '|' 位或运算符(两个位只要有一个为1,那么结果就是1,否则就为0)
System.out.print("1|-3 = ");
System.out.println(1|-3);
/*计算过程(使用补码)
1: 00000000 00000000 00000000 00000001
-3: 11111111 11111111 11111111 11111101
结果: 11111111 11111111 11111111 11111101 (结果也是补码,转成原码 10000000 00000000 00000000 00000011) -3
*/

//3. '~' 位非运算符(如果位为0,结果是1,如果位为1,结果是0)
System.out.print("~-3 = ");
System.out.println(~-3);
/*计算过程(使用补码)
-3: 11111111 11111111 11111111 11111101
结果: 00000000 00000000 00000000 00000010 (正数,原码相同) 2
*/

//4. '^' 位异或运算符(两个操作数,相同则结果为0,不同则结果为1)
System.out.print("1^-3 = ");
System.out.println(1^-3);
/*计算过程(使用补码)
1: 00000000 00000000 00000000 00000001
-3: 11111111 11111111 11111111 11111101
结果: 11111111 11111111 11111111 11111100 (转成原码:10000000 00000000 00000000 0000 0100) -4
*/

//5. '<<' 左移运算符(左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0))
System.out.print("-3<<2 = ");
System.out.println(-3<<2);
/*计算过程(使用补码)
-3: 11111111 11111111 11111111 11111101
结果: 11111111 11111111 11111111 11110100 (转成原码:10000000 00000000 00000000 00001100) -12
*/

//6. '>>' 右移运算符("有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。如果值为正,则在高位补0,如果值为负,则在高位补1.)
System.out.print("-3>>2 = ");
System.out.println(-3>>2);
/*计算过程(使用补码)
-3: 11111111 11111111 11111111 11111101
结果: 11111111 11111111 11111111 11111111 (转成原码:10000000 00000000 00000000 00000001) -1
*/

//7. '>>>' 右移运算符("无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。无论值的正负,都在高位补0.)
System.out.print("-3>>>2 = ");
System.out.println(-3>>>2);
/*计算过程(使用补码)
-3: 11111111 11111111 11111111 11111101
结果: 00111111 11111111 11111111 11111111 2^30次方 - 1 = 1073741823

posted @ 2019-08-20 11:11  赵六六  阅读(357)  评论(0编辑  收藏  举报