public class ShiftTest {
public static void main(String[] args) {
//右移1位演示
int x=0x80000000;
System.out.println("x的十进制表示形式为:"+x);
System.out.println("x的二进制表示形式为:"+Integer.toBinaryString(x));
int y=x>>1;
System.out.println("y的十进制表示形式为:"+y);
System.out.println("y的二进制表示形式为:"+Integer.toBinaryString(y));
int z=x>>>1;
System.out.println("z的十进制表示形式为:"+z);
System.out.println("z的二进制表示形式为:"+Integer.toBinaryString(z));
//左移1位演示
int m=0xC0000000;
System.out.println("m的十进制表示形式为:"+m);
System.out.println("m的二进制表示形式为:"+Integer.toBinaryString(m));
int n=m<<1;
System.out.println("n的十进制表示形式为:"+n);
System.out.println("n的二进制表示形式为:"+Integer.toBinaryString(n));
}
}
//输出结果:
//x的十进制表示形式为:-2147483648
//x的二进制表示形式为:10000000000000000000000000000000
//y的十进制表示形式为:-1073741824
//y的二进制表示形式为:11000000000000000000000000000000
//z的十进制表示形式为:1073741824
//z的二进制表示形式为:1000000000000000000000000000000
//m的十进制表示形式为:-1073741824
//m的二进制表示形式为:11000000000000000000000000000000
//n的十进制表示形式为:-2147483648
//n的二进制表示形式为:10000000000000000000000000000000
总结:
1.Java中int占4个字节的内存空间,也就是32个二进制位,这也就是我们常说的二进制位。
而一个16进制位相当于4个二进制位,所以int占用8个16进制位。所以 int x=0x80000000;应该能看明白。
2.java中“左移位”运算符 “<<”,是将整型数据的二进制形式,各数位向左移动给定的位数。右边的空出的所有位数补0。如,a<<1,是将a的二进制表示形式,左移移位,右边补零。
3.java中“有符号右移位”运算符 “>>”,是将整型数据的二进制形式,各数位向右移动给定的位数。左边的空出的所有位数根据移位前的符号进行填充,也就是说,如果为整数,则填1,如果为负数,则填0.
4.java中“无符号右移位”运算符 “>>>”,是将整型数据的二进制形式,各数位向右移动给定的位数。左边的空出的所有位数补0。
5.java中,移位运算符适用的数据类型有:byte short char int long。
6.对于低于int型的操作数,先转换为int型再移位。
即:原始数据类型执行算术运算(或按位运算),类型比int型小的(即char、byte、short、),在进行运算之前,这些值会自动提升成int型。参见:使用java原始数据类型的几处细节
7.对于int型整数移位,a>>b,系统先将b对32取模,得到的结果才是真正的移位的位数。例如:a>>33和a>>1的结果是一样的。而,a>>32的结果就是a。(即一个int型数是32位的,如果你移动了32位,那么所有数位都移出了,就没有什么意义了,所以系统会先将移动的位数对32取模)
8.对于long型整数移位,a>>b,系统先将b对64取模,得到的结果才是真正的移位的位数。
9.a>>1与a/2的结果是一样的,a<<1与a*2的结果是一样的。
总之,一个数右移n位的结果是这个数除以2的n次方。一个数左移n位的结果是这个数乘以2的n次方。所以,当我们需要用程序求2的n次方时,可以写成这样,iresult=1<<n;
转载于:http://zhanyayun533.blog.163.com/blog/static/133176219201210269474644/