java取反 -右移-左移-无符号右移的探讨

取反:
		在二进制中第一位,1表示符数,0表示正数
		byte a = -1;
		原码:10000001
		反码:11111110
		补码:11111111
      //异或: 00000000
		byte b = -2;
		原码:10000010
		反码:11111101
		补码:11111110
      //异或: 00000001
		
		byte c = 3;
         
		//    10000101
		
	System.out.println(~a);
	System.out.println(~b);
	System.out.println(~c);

 

运算结果:
0
1
-4

 

右移:正数右移.负数右移 ,无符号右移

右移的符号是:>>

无符号右移的符号的:>>>

在左右位移时应注意,位移是否超过了数据的长度,如果超过了就会进行取摸运算等:下面的代码中有测试到

 

 

		//右移:
		//右移一个正数,右移一个整数每次在左边补0
		
		 	int a = 5;
		System.out.println(a>>1);
	     //原码;	0000000101
		//右移一位: 0000000010
		System.out.println(a>>2);
	     //原码;	0000000101
		//右移两位: 0000000001
		 System.out.println(a>>3);
	     //原码;	0000000101
		//右移三位: 0000000000
		
		 		System.out.println(a>>31);
		//原码;  	0000000101
		//右移32位: 0000000000
		
		    System.out.println(a>>32);
	    //int 为32位,当位移等于32时,相当于没有移动,会进行取摸运算
   	System.out.println(a>>34);
    	//位移大于32时,进行取摸运算 34%32 = 2
    	//此时相当于位移两位
   
   	
   	System.out.println(a>>>1);
	//无符号右移最高位补0
    	// 原码: 0000000101
 //无符号右移 :     0000000010   2

 

运算结果:

2
1
0
0
5
1
2

 

 

负数右移:

		//右移一个负数,右移一个整数每次在左边补1
		//位移负数,应先将其装换成补码形式,再位移
	int a = -5;
		//原码:100000101
		//反码:111111010 反码是和原码的数相反  第一位相同(符号位)
		//补码:111111011 补码在反码后面加1
		System.out.println(a>>1);
		//补码:111111011 
//补码右移一位: 111111101 -3
		System.out.println(a>>2);
		//补码:111111011 
//补码右移两位: 111111110  -2
	System.out.println(a>>3);
		//补码:111111011 
//补码右移三位: 111111111  -1
	System.out.println(a>>4);
		//补码:111111011 
//补码右移四位: 111111111  -1
		System.out.println(a>>31);
		//补码:111111011 
//补码右移31位: 111111111  -1
	System.out.println(a>>32);
          //int为32 位的数,在位移时,等于没有移动  -5
	System.out.println(a>>34);
		//int 为32位的,位移34会进行取摸运算   34%32 =2  -2
	  
		System.out.println(a>>>1);
		 //无符号负数的右移在最高位补1;
		//补码:111111011 
//无符号右移1位:011111101  此时负数将变成一个正数
		
		

 

-3
-2
-1
-1
-1
-5
-2
2147483645

 

 

 

左移:

左移的符号:<<

左移无符号的正负数的符号:<<<

左移的右边补0

//左移正数

	int a = 5;
		//补码:00000101
		System.out.println(a<<1);
		//00001010 10
		System.out.println(a<<2);
		//00010100 20
		System.out.println(a<<31);
		//为一个负数,左移应注意

 

运算结果:

10
20
-2147483648

 

 

左移负数:

左移都是右边补0

		int a = -5;
		//补码:11111011 
		
		System.out.println(a<<1);
		//左移一位:11110110 -10
		System.out.println(a<<2);
		//左移两位:11101100 -20
		System.out.println(a<<31);
		//左移31会出现问题
		System.out.println(a<<34);
		//相当于左移两位
		//左移两位:11101100 -20

 

运算结果:
-10
-20
-2147483648
-20

 

 

使用位移来求二进制的问题:

	public static void main(String[] args) {
		//通过右移将十进制的数转换成二进制
		int  a = 100;
		for(int i =31;i>0;i--){
			System.out.print(a>>i&1);
			
		}
	}

 

运算结果:
0000000000000000000000000110010

 

你可能感兴趣的:(位运算符 位移)