`
Luob.
  • 浏览: 1584481 次
  • 来自: 上海
社区版块
存档分类
最新评论

java 位移运算符 ">>" "<<" ">>>"

    博客分类:
  • Java
 
阅读更多
public class test19 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a=2*4;
		int b=2<<2; // 2*2^2
		System.out.println(a+"//"+b);
		int c=3<<2;  
		//0000 0000 0000 0000 0000 0000 0000 0011-->00 0000 0000 0000 0000 0000 0000 0011
		//0000 0000 0000 0000 0000 0000 0000 1100-->1100-->12
		System.out.println(c);
		int d=11>>2; //0000 0000 0000 0000 0000 0000 0000 1000-->0000 0000 0000 0000 0000 0000 0000 10
		//0000 0000 0000 0000 0000 0000 0000 0010--2
		System.out.println(d);
		
		int e=11>>>2;  //8>>2==8/2*2
		System.out.println(e);
		

	}

}
 
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次方

  4)计算过程:

  例如:3 <<2(3为int型)

  1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,

  2)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,

  3)在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,

  转换为十进制是12。

  移动的位数超过了该类型的最大位数,

  如果移进高阶位(31或63位),那么该值将变为负值。下面的程序说明了这一点:

  Java代码

  // Left shifting as a quick way to multiply by 2.

  public class MultByTwo {

  public static void main(String args[]) {

  int i;

  int num = 0xFFFFFFE;

  for(i=0; i<4; i++) {

  num = num << 1;

  System.out.println(num);

  }

  }

  }

  // Left shifting as a quick way to multiply by 2.

  public class MultByTwo {

  public static void main(String args[]) {

  int i;

  int num = 0xFFFFFFE;

  for(i=0; i<4; i++) {

  num = num << 1;

  System.out.println(num);

  }

  }

  }

  该程序的输出如下所示:

  536870908

  1073741816

  2147483632

  -32

  注:n位二进制,最高位为符号位,因此表示的数值范围-2^(n-1) ——2^(n-1) -1,所以模为2^(n-1)。

  2、 右移运算符

  右移运算符<<使指定值的所有位都右移规定的次数。

  1)它的通用格式如下所示:

  value >> num

  num 指定要移位值value 移动的位数。

  右移的规则只记住一点:符号位不变,左边补上符号位

  2)运算规则:

  按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1

  当右移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。

  例如,如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(sign extension ),在进行右移

  操作时用来保持负数的符号。

  3)数学意义

  右移一位相当于除2,右移n位相当于除以2的n次方。

  4)计算过程

  11 >>2(11为int型)

  1)11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011

  2)把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。

  3)最终结果是0000 0000 0000 0000 0000 0000 0000 0010。

  转换为十进制是3。

  35 >> 2(35为int型)

  35转换为二进制:0000 0000 0000 0000 0000 0000 0010 0011

  把低位的最后两个数字移出:0000 0000 0000 0000 0000 0000 0000 1000

  转换为十进制: 8

  5)在右移时不保留符号的出来

  右移后的值与0x0f进行按位与运算,这样可以舍弃任何的符号位扩展,以便得到的值可以作为定义数组的下标,从而得到对应数组元素代表的十六进制字符。

  例如

  Java代码

  public class HexByte {

  public static public void main(String args[]) {

  char hex[] = {

  '0', '1', '2', '3', '4', '5', '6', '7',

  '8', '9', 'a', 'b', 'c', 'd', 'e', 'f''

  };

  byte b = (byte) 0xf1;

  System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);

  }

  }

  public class HexByte {

  public static public void main(String args[]) {

  char hex[] = {

  '0', '1', '2', '3', '4', '5', '6', '7',

  '8', '9', 'a', 'b', 'c', 'd', 'e', 'f''

  };

  byte b = (byte) 0xf1;

  System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);

  }

  }

  (b >> 4) & 0x0f的运算过程:

  b的二进制形式为:1111 0001

  4位数字被移出:0000 1111

  按位与运算:0000 1111

  转为10进制形式为:15

  b & 0x0f的运算过程:

  b的二进制形式为:1111 0001

  0x0f的二进制形式为:0000 1111

  按位与运算:0000 0001

  转为10进制形式为:1

  所以,该程序的输出如下:

  b = 0xf1

  3、无符号右移

  无符号右移运算符>>>

  它的通用格式如下所示:

  value >>> num

  num 指定要移位值value 移动的位数。

  无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位

  无符号右移运算符>>> 只是对32位和64位的值有意义
0
0
分享到:
评论

相关推荐

    java位运算符.pdf

    位移运算符则有右移(&gt;&gt;&gt;和&gt;&gt;)和左移(&lt;&lt;)。 1. **位逻辑运算符**: - **按位非(NOT)**:`~`运算符,对整数的每个位执行逻辑非操作,即将1变为0,将0变为1。例如,`~42`(二进制表示为00101010)会产生...

    Java运算符+(优先级、目数)+.doc

    11. **位移运算符(&lt;&lt;, &gt;&gt;, &gt;&gt;&gt;):** 左移位运算符将二进制位向左移动指定位数,右移位运算符则向右移动。无符号右移运算符对负数也会填零。这些都是双目的运算符,从左到右结合。 12. **关系运算符(&lt;, &gt;, &lt;=, &gt;=, ...

    Java移位运算符详解实例(小结)

    Java移位运算符是Java语言中的一种基本运算符,用于对二进制数进行位移操作。移位运算符主要包括左移位运算符(&lt;&lt;)、右移位运算符(&gt;&gt;&gt;)和带符号的右移位运算符(&gt;&gt;)。这些运算符可以单独用来处理int型整数。 1....

    李妍的Java学习之路-Java运算符

    位运算符,如 AND (&), OR (|), XOR (^), NOT (~) 以及位移运算符 (&lt;&lt;, &gt;&gt;, &gt;&gt;&gt;),作用于整数类型的二进制表示。位运算符直接操作二进制位,例如 `a & b` 会返回 `a` 和 `b` 的二进制与运算结果。位移运算符会改变...

    Java移位运算符1

    本文将深入探讨Java中的三种移位运算符:左移运算符(&lt;&lt;),右移运算符(&gt;&gt;)以及无符号右移运算符(&gt;&gt;&gt;)。 1. 左移运算符(&lt;&lt;) 左移运算符(&lt;&lt;)将一个数的二进制表示向左移动指定的位数。例如,如果`num`是一个...

    java运算符优先级[借鉴].pdf

    在Java语言中,按位运算符(&、|、^)的优先级高于关系运算符(&lt;、&gt;、&lt;=、&gt;=),因此在执行按位运算时,需要注意运算符的优先级。 了解Java运算符优先级是非常重要的,掌握这些知识可以帮助我们编写更加正确和高效的...

    10_02.rar_10_02_java 位移

    3. 位移运算符:深入理解&lt;&lt;、&gt;&gt;和&gt;&gt;&gt;的用法及它们对二进制数据的影响。 4. 图形生成:如何通过编程实现分形山的可视化。 5. 注释规范:良好的编程习惯,通过注释解释关键代码的功能和作用。 通过分析并运行这个程序...

    Java运算符.docx

    位移`&lt;&lt;`、`&gt;&gt;`和`&gt;&gt;&gt;`;比较运算符`&lt;`、`&gt;`、`&lt;=`、`&gt;=`和`instanceof`;相等性运算符`==`和`!=`;按位与`&`;异或`^`;最后是逻辑运算符`&&`、`||`。 了解这些运算符及其用法对编写Java代码至关重要,因为它们...

    Java运算符常见面试题及答案

    11. **位移运算符**:左移(&lt;&lt;)和右移(&gt;&gt;)用于将二进制位向左或向右移动指定的位数。例如,`5 &lt;&lt; 2`将返回20(二进制表示为101左移两位变为10100)。 12. **取反运算符**:`~`用于对整数进行按位取反,将0变为1...

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

    位移`&lt;&lt; &gt;&gt; &gt;&gt;&gt;` 9. 按位与`&` 10. 按位异或`^` 11. 按位或`|` 12. 逻辑与`&&` 13. 逻辑或`||` 14. 条件运算符`? :` 15. 赋值运算符`= += -= *= /= %= &= ^= |= &lt;&lt;= &gt;&gt;= &gt;&gt;&gt;=` #### 六、示例 假设我们有一...

    Java运算符优先级别.doc

    5. **位移运算符** `&lt;&lt;`, `&gt;&gt;`, `&gt;&gt;&gt;`:从左到右结合。 - **左移** `&lt;&lt;`:将二进制数的各位向左移动。 - **右移** `&gt;&gt;`:将二进制数的各位向右移动。 - **无符号右移** `&gt;&gt;&gt;`:与右移类似,但高位补0。 6. **...

    Java运算符 &#40;优先级、目数&#41; [1].doc

    - 移位运算符`&lt;&lt;`、`&gt;&gt;`和`&gt;&gt;&gt;`用于位移操作,`&lt;&lt;`是左移,`&gt;&gt;`是带符号右移,`&gt;&gt;&gt;`是无符号右移。 - 关系运算符`&lt;`、`&gt;`、`&lt;=`、`&gt;=`用于比较,`instanceof`用来检查对象是否属于特定类或其子类。 - 等于`==`和...

    Java编程详细教程运算符表达式流程控制上PPT教案学习.pptx

    位移运算符`&lt;&lt;`和`&gt;&gt;`分别用于左移和右移位,`&gt;&gt;&gt;`是无符号右移,移位过程中高位不会填充符号位。 最后,赋值运算符允许我们简洁地进行赋值操作,比如`x+=y`相当于`x = x + y`。同时,Java支持将其他运算符与赋值...

    Java操作符的优先级和结合性

    6. 移位运算符:`&lt;&lt;`、`&gt;&gt;`、`&gt;&gt;&gt;` —— 从左到右执行,用于位移操作,如 `a &lt;&lt; 2`。 7. 关系运算符:`&lt;`、`&lt;=`、`&gt;`、`&gt;=`、`instanceof` —— 从左到右执行,用于比较操作,如 `a &lt; b`。 8. 相等运算符:`==`、`...

    Java SE-基础篇-运算符、随机数(Random)、方法、数组-入门级讲解

    - 位运算符:如按位取反(`~`), 按位与(`&`), 按位或(`|`), 按位异或(`^`)以及位移运算符,如左移(`&lt;&lt;`), 带符号右移(`&gt;&gt;`)和无符号右移(`&gt;&gt;&gt;`)。位移运算符常用于快速计算乘法和除法。 2. 随机数(Random): ...

    Java编程基础语法

    5. **位移运算** `&lt;&lt; &gt;&gt; &gt;&gt;&gt;` 6. **比较运算** `&lt; &gt; &lt;= &gt;= instanceof` 7. **相等运算** `== !=` 8. **按位与运算** `&` 9. **按位异或运算** `^` 10. **按位或运算** `|` 11. **逻辑与运算** `&&` 12. **逻辑或运算...

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

    位运算符直接作用于整数类型的二进制表示,包括与(&)、或(|)、异或(^)、非(~)以及左移(&lt;&lt;)和右移(&gt;&gt;、&gt;&gt;&gt;). 这些运算符在进行位级操作时非常有用,比如在位掩码、数据加密、优化算法等方面。 1. **与(&)**: 它执行...

Global site tag (gtag.js) - Google Analytics