移位操作平时用的较少,但其实很常见。平时看一些java.lang里面的源码就会发现很多进行了移位操作。对于计算机而言,移位操作时最快的。今天简单总结下我所认识的移位操作。
请看下面这段测试代码:
//100=64+32+4 int i = 1; i = ((i<<6) //i*64 + (i<<5) //i*32 + (i<<2)); //i*4 System.out.println(i); //i*100 int j = 1; j = j<<1+j+2; System.out.println(j); long k = 2147483648l; long l = k / 100; int r = (int)(k - ((l<<6) + (l<<5) + (l<<2))); System.out.println(r); int a1 = -20; //负数为补码(反码+1)int类型占4个字节,32位 System.out.println(Integer.toBinaryString(a1)); a1 = a1>>>20; //不考虑符号位 System.out.println(a1); System.out.println(Integer.toBinaryString(a1)); int a2 = -20; //负数为补码(反码+1)int类型占4个字节,32位 System.out.println(Integer.toBinaryString(a2)); a2 = a2>>20; System.out.println(a2);
执行结果为:
100 16 48 11111111111111111111111111101100 4095 111111111111 11111111111111111111111111101100 -1 11111111111111111111111111111111
可以看到,移位对于数字的操作时多么灵活,注意的是,>>与>>>,前者是考虑符号位,后者不考虑符号位。