当前位置:首页 > 开发 > 编程语言 > Java > 正文

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

发表于: 2014-06-10   作者:百合不是茶   来源:转载   浏览:
摘要: 取反: 在二进制中第一位,1表示符数,0表示正数 byte a = -1; 原码:10000001 反码:11111110 补码:11111111 //异或: 00000000 byte b = -2; 原码:10000010 反码:11111101 补码:11111110 //异或: 00000001
取反:
		在二进制中第一位,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

 

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

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
转自:http://blog.csdn.net/hengshan/article/details/6440549 今天在看X264的源代码时,发现里面
今天写一个比较有意思的东西 -- C#移位运算(左移和右移)。 C#是用<<(左移) 和 >>(右移
今天写一个比较有意思的东西 -- C#移位运算(左移和右移)。 C#是用<<(左移) 和 >>(右移
移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift)。 逻辑移位:移出
转载地址:http://blog.csdn.net/hengshan/article/details/6440549 移位运算包含“逻辑移位”(log
转自:http://blog.csdn.net/hengshan/article/details/6440549 今天在看X264的源代码时,发现里面
<table cellspacing="1" width="350px" align="center"> <tr> <td> <table st
1). 源码 1 //十进制数转十六进制 2 import java.util.Scanner; 3 4 public class Test01{ 5 public
#include <iostream> #include <cstdlib> #include <string> #include <queue
多年没用过很基础的东西,对这些移位运算符全部忘记干净了,耳旁还响起老师曾经说过,移位运算的效率
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号