`
百合不是茶
  • 浏览: 354990 次
社区版块
存档分类
最新评论

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

 

分享到:
评论

相关推荐

    java位运算,符号运算 详细解释

    7. 无符号右移(&gt;&gt;&gt;): 对于无符号右移,无论正负,右边都用0填充。 三、位运算的实际应用 1. 位掩码:通过位运算和位掩码,我们可以快速地检查、设置或清除特定的位,例如在权限控制、状态标志等场景。 2. 数据压缩...

    java代码-BitLogic

    位操作是直接在二进制位级别上进行的运算,包括位与(&)、位或(|)、位异或(^)、位非(~)、左移()、右移(&gt;&gt;)和无符号右移(&gt;&gt;&gt;). 这些操作符允许我们高效地处理数字,有时甚至比使用常规算术运算更快。 标题"java代码-...

    【IT十八掌徐培成】Java基础第02天-04.运算符-移位运算-逻辑运算.zip

    Java支持三种类型的移位运算:左移(),右移(&gt;&gt;)和无符号右移(&gt;&gt;&gt;)。左移运算符将二进制数的所有位向左移动指定的位数,空出的位置由0填充。例如,`5 的结果是20,因为5的二进制形式是0101,左移两位后变为...

    【IT十八掌徐培成】Java基础第03天-01.位运算-数据类型.zip

    位运算符包括按位与(&),按位或(|),按位异或(^),按位非(~),左移(),右移(&gt;&gt;)和无符号右移(&gt;&gt;&gt;). 1. 按位与(&):两个操作数相应位上都为1时,结果位上才为1;否则为0。 2. 按位或(|):两个操作数相应位上至少有一...

    java基础教程java基础教程java基础教程

    此外,Java还提供了三种移位运算符:左移(), 带符号右移(&gt;&gt;), 无符号右移(&gt;&gt;&gt;). 左移将所有位向左移动指定次数,右移则向右移动,带符号右移会根据符号位填充,无符号右移则一律用0填充。 移位运算符的优先级高于...

    java-leetcode题解之第1284题转化为全零矩阵的最少反转次数.zip

    位运算可以直接对二进制数进行操作,例如按位与(&),按位或(|),按位异或(^),左移(),右移(&gt;&gt;),无符号右移(&gt;&gt;&gt;). 在本题解中,可能会用到位运算来快速统计行或列中1的数量,从而确定是否需要反转。 知识点4:数据...

    java位运算1.pdf

    // 1073741823 (无符号右移,负数的补码处理) ``` 位运算在某些特定场景下非常有用,例如: - **高效计算**:位运算通常比算术运算快,因此在性能敏感的代码中,可以用来替代简单的算术操作,如快速除以2(右移一...

    JAVA中位运算符合移为运算符

    无符号右移在处理二进制数据时特别适用于保持数据的完整性,特别是处理二进制编码格式(如IP地址或颜色编码)时。 通过了解这些概念,开发者可以编写出更为高效且精确的代码,尤其是在处理大量数据或进行低级别的...

    Java程序设计基础:运算符与表达式.pptx

    - `&gt;&gt;`:无符号右移。 - `左移。 - **赋值运算符**: - `=`:简单的赋值运算符。 - `+=`, `-=`,`*=`,`/=`,`%=`:复合赋值运算符,它们简化了赋值语句,使得代码更简洁。 #### 五、运算符优先级 - **运算符...

    JAVA位运算.pdf

    此外,还有位移运算符,如`&gt;&gt;`(右移)、`&gt;&gt;&gt;`(无符号右移)、`(左移),以及相应的复合赋值运算符,如`&=`、`|=`、`^=`、`&gt;&gt;=`、`&gt;&gt;&gt;=`、`。 #### 二进制表示和负数处理 理解Java如何存储整数值以及如何表示...

    Java位操作

    位操作主要包括:按位与(&),按位或(|),按位异或(^),按位非(~),左移(),右移(&gt;&gt;或&gt;&gt;&gt;),以及无符号右移(&gt;&gt;&gt;,仅适用于整型和长整型)。这些操作直接作用于二进制表示,对于理解计算机底层工作原理至关重要。 1. *...

    位运算课件(java学习位运算课件)

    在Java中,位运算主要包括按位与(&),按位或(|),按位异或(^),按位非(~),左移(),右移(&gt;&gt;)和无符号右移(&gt;&gt;&gt;). 这些运算符可以在整型变量之间进行,用于直接操作它们的二进制表示。例如,按位与运算符"&"用于两个位...

    【Java】循环移码和补码.zip

    在Java中,可以使用`&gt;&gt;&gt;`运算符实现无符号右移,相当于循环右移,对于正数和负数都是如此。此外,`运算符用于左移,而`&gt;&gt;`运算符则表示有符号右移,可能会导致负数的非循环移位。循环移码常用于位编码、解码以及位...

    黑马程序员Java基础视频辅导班Day01

    - **位运算符**:如`&`(按位与)、`|`(按位或)、`^`(按位异或)、`~`(按位取反)、`(左移)、`&gt;&gt;`(右移)、`&gt;&gt;&gt;`(无符号右移)。 #### 进制转换 1. **其他进制转十进制**: - 将每一位的系数乘以基数的...

    java 位操作集合以及应用技巧

    7. 无符号右移&gt;&gt;&gt;:无论操作数的符号位如何,都用0填充移出的空位。 二、位操作的应用 1. 数据存储优化:对于只需要存储少量状态或标志位的情况,使用位操作可以节省内存空间,如位字段表示。 2. 高效计算:位操作...

    JavaSE第三天笔记

    位运算符(如按位与`&`、按位或`|`、按位异或`^`、按位取反`~`、左移`、有符号右移`&gt;&gt;`和无符号右移`&gt;&gt;&gt;`)是针对二进制位进行操作的运算符,它们在处理二进制数据和优化性能时非常有效。例如,按位与`&`运算符,...

    Java运算案例(算数运算+赋值运算+逻辑运算+关系运算+自增运算+自减运算+条件运算+位运算)

    位运算符作用于二进制级别,包括按位与(&), 按位或(|), 按位异或(^), 左移(), 右移(&gt;&gt;), 无符号右移(&gt;&gt;&gt;), 以及按位取反(~)。位运算通常在处理位标志或低级别数据操作时使用。 通过实际案例学习和练习这些运算符,...

    bitoperation_jni_AndroidJNI位操作_android_

    右移(&gt;&gt;)则向右移动,无符号右移会用0填充空位,有符号右移则保留符号位。 3. **在JNI中使用位操作**:在C/C++代码中,我们可以直接对整型变量进行位操作。例如,`int result = value1 & value2;`表示对`value1`...

    securegraph-inmemory-0.6.0.zip

    7. 无符号右移&gt;&gt;&gt;:无论正负,都用0填充左侧空出的位。 位操作通常用于高效地处理内存中的原始数据,如在内存有限的设备上存储和读取数据,或者实现特定的算法,如快速计算数字的二进制表示。 二、BitUtils工具库 ...

Global site tag (gtag.js) - Google Analytics