java中的移位运算符

java 基础系列

1、 左移运算符

左移运算符<<使指定值的所有位都左移规定的次数。
1)它的通用格式如下所示:
value << num
num 指定要移位值value 移动的位数。
左移的规则只记住一点:丢弃最高位,0补最低位
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位。

2)运算规则
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
当左移的运算数是int 类型时,每移动1位它的第31位就要被移出并且丢弃;
当左移的运算数是long 类型时,每移动1位它的第63位就要被移出并且丢弃。
当左移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。

3)数学意义
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方
eg:

public static void main(String[] args) {
		   int i;  
		   int num = 0xFFFFFFE;   
		   for(i=0; i<4; i++) {  
		   // 循环一次向右移动一位     符号位不变,左边补上符号位
		       num = num << 1;  
		     System.out.print(""+(num)+" size:"+Integer.toBinaryString(num).length()+"  \n");
		     System.out.print(""+Integer.toBinaryString(num)+" size:"+Integer.toBinaryString(num).length()+"  \n");

		   }  
	}

输出结果:

536870908 size:29  
11111111111111111111111111100 size:29  
1073741816 size:30  
111111111111111111111111111000 size:30  
2147483632 size:31  
1111111111111111111111111110000 size:31  
-32 size:32  
11111111111111111111111111100000 size:32  第四次就是溢出了,变为负数

2、右移运算符>>:

使指定值的所有位都右移规定的次数。
它的通用格式如下所示:
value >> num

1)num 指定要移位值value 移动的位数。
右移的规则只记住一点:符号位不变,左边补上符号位
2)运算规则:
按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1

当右移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。
例如,如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(sign extension ),在进行右移
操作时用来保持负数的符号。

3)数学意义
右移一位相当于除2,右移n位相当于除以2的n次方。

eg:

public static void main(String[] args) {
		int d = -7; // 
		// 第一句打印出 d=-7的二进制   size 表示二进制的长度
		System.out.print(""+Integer.toBinaryString(d)+" size:"+Integer.toBinaryString(d).length()+"  \n");
		// 第二句打印出 d=-7 右移一位的二进制   size 表示二进制的长度
		System.out.print(""+Integer.toBinaryString(d>>1)+" size:"+Integer.toBinaryString(d>>1).length()+"  \n");
		// 第三句打印出 d=-7 右移一位的数字   size 表示二进制的长度
		System.out.print(""+(d>>1)+" size:"+Integer.toBinaryString(d>>1).length()+"  \n");
	}

输出结果:

11111111111111111111111111111001 size:32  
11111111111111111111111111111100 size:32  
-4 size:32  

3、无符号右移 >>>

它的通用格式如下所示:
value >>> num
num 指定要移位值value 移动的位数。
无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位
无符号右移运算符>>> 只是对32位和64位的值有意义

eg:

	public static void main(String[] args) {
		int d = -7; // 
		System.out.print(""+Integer.toBinaryString(d)+" size:"+Integer.toBinaryString(d).length()+"  \n");
		System.out.print(""+Integer.toBinaryString(d>>>1)+" size:"+Integer.toBinaryString(d>>>1).length()+"  \n");
		System.out.print(""+(d>>>1)+" size:"+Integer.toBinaryString(d>>>1).length()+"  \n");

	}

输出结果:

11111111111111111111111111111001 size:32  
1111111111111111111111111111100 size:31   // 整体右移一位,最高位补0
2147483644 size:31  

你可能感兴趣的:(java,JAVA,右移运算符,左移运算符)