java中的移位操作

Posted brucemengbm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的移位操作相关的知识,希望对你有一定的参考价值。

java中的移位操作仅仅对int和long有效,byte、short、char升级为int后再进行移位


移位操作符有>>(右移)、<<(左移)、>>>(右移)三种,注意两点:1.没有<<<符号  2.移位是不循环的

三种的差别是

>>是带符号右移。负数高位补1,正数补0         ----->>>也就是在高位用符号位进行填充。

<<左移无论负数还是正数,在低位永远补0

>>>是不带符号右移,不论负数还是正数,高位补0( 无符号右移。忽略符号位。空位都以0补齐


在详细的运算中所有转化为补码逻辑进行移位或者按位运算。


測试程序:

[java] view plain copy
  1. public class Shift {  
  2.     public static void main(String[] args) {  
  3.         System.out.println("******************正数左移在低位补0*******************");  
  4.         int a = 1;  
  5.         a = a << 2;  
  6.         System.out.println(a);  
  7.         System.out.println(Integer.toBinaryString(a));  
  8.         System.out.println("******************正数右移在高位补0********************");  
  9.         a = 1;  
  10.         a = a >> 2;  
  11.         System.out.println(a);  
  12.         System.out.println(Integer.toBinaryString(a));  
  13.         System.out.println("******从上面结果能够看出:移位是不循环的*****");  
  14.         System.out.println("看看负数的移位:");  
  15.   
  16.         System.out.println("***********负数的右移操作高位补1**************");  
  17.         int i = -1;  
  18.         System.out.println(i + ":");  
  19.         System.out.println(Integer.toBinaryString(i));  
  20.         i = i >> 2;  
  21.         System.out.println(i);  
  22.         System.out.println(Integer.toBinaryString(i));  
  23.         System.out.println("**********负数的左移操作低位补0*****************");  
  24.         i = i << 2;  
  25.         System.out.println(i);  
  26.         System.out.println(Integer.toBinaryString(i));  
  27.         System.out.println("*************再看看>>>操作符*************");  
  28.         System.out.println("*************负数的>>>操作高位补0***************");  
  29.         i = -1;  
  30.         System.out.println(Integer.toBinaryString(i));  
  31.         i = i >>> 10;  
  32.         System.out.println(i + ":");  
  33.         System.out.println(Integer.toBinaryString(i));  
  34.         System.out.println("*************注意:没有<<<符号**************");  
  35.   
  36.         System.out.println("**********byte类型移位时要强转换*************");  
  37.         byte k = 10;  
  38.         System.out.println(Integer.toBinaryString(k));  
  39.         k = (byte) ((byte) k >>> 2);  
  40.         System.out.println(Integer.toBinaryString(k));  
  41.     }  
  42. }  

执行结果:

******************正数左移在低位补0*******************
4
100
******************正数右移在高位补0********************
0
0
******从上面结果能够看出:移位是不循环的*****
看看负数的移位:
***********负数的右移操作高位补1**************
-1:
11111111111111111111111111111111
-1
11111111111111111111111111111111
**********负数的左移操作低位补0*****************
-4
11111111111111111111111111111100
*************再看看>>>操作符*************
*************负数的>>>操作高位补0***************
11111111111111111111111111111111
4194303:
1111111111111111111111
*************注意:没有<<<符号**************
**********byte类型移位时要强转换*************
1010
10


以上是关于java中的移位操作的主要内容,如果未能解决你的问题,请参考以下文章

java中的移位操作

java移位操作符注意的问题

C语言深度剖析深入理解C语言中的移位操作符(代码+图解)

使用移位操作代替乘除运算

Java中的位运算

移位操作符