`

java中的移位运算符--解释byte或short值进行右移位运算结果为-1

 
阅读更多

         在进行位操作时有哪些详细规则呢?在看完think in java后有了更详细的解。也解决了byte或short值进行右移位运算结果为-1的问题

         以下引自think in java需大家注意移位的规则更要注意的是byte、short的右移位特殊性!

         移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)。左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突)。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。可用下面这个例子检测自己的实现方案:

 

//: URShift.java 
// Test of unsigned right shift 
 
public class URShift { 
  69
  public static void main(String[] args) { 
    int i = -1; 
    i >>>= 10; 
    System.out.println(i); 
    long l = -1; 
    l >>>= 10; 
    System.out.println(l); 
    short s = -1; 
    s >>>= 10; 
    System.out.println(s); 
    byte b = -1; 
    b >>>= 10; 
    System.out.println(b); 
  } 
}

 移位可与等号(<<=或>>=或>>>=)组合使用。此时,运算符左边的值会移动由右边的值指定的位数,再将得

 

到的结果赋回左边的值。 

下面这个例子向大家阐示了如何应用涉及“按位”操作的所有运算符,以及它们的效果:

 

//: BitManipulation.java 
// Using the bitwise operators 
import java.util.*; 
 
public class BitManipulation { 
  public static void main(String[] args) { 
    Random rand = new Random(); 
    int i = rand.nextInt(); 
    int j = rand.nextInt(); 
    pBinInt("-1", -1); 
    pBinInt("+1", +1); 
    int maxpos = 2147483647; 
    pBinInt("maxpos", maxpos); 
    int maxneg = -2147483648; 
    pBinInt("maxneg", maxneg); 
    pBinInt("i", i); 
    pBinInt("~i", ~i); 
    pBinInt("-i", -i); 
    pBinInt("j", j); 
    pBinInt("i & j", i & j); 
    pBinInt("i | j", i | j); 
    pBinInt("i ^ j", i ^ j); 
    pBinInt("i << 5", i << 5); 
    pBinInt("i >> 5", i >> 5); 
    pBinInt("(~i) >> 5", (~i) >> 5); 
    pBinInt("i >>> 5", i >>> 5); 
    pBinInt("(~i) >>> 5", (~i) >>> 5); 
 
    long l = rand.nextLong(); 
    long m = rand.nextLong(); 
    pBinLong("-1L", -1L); 
    pBinLong("+1L", +1L); 
  70
    long ll = 9223372036854775807L; 
    pBinLong("maxpos", ll); 
    long lln = -9223372036854775808L; 
    pBinLong("maxneg", lln); 
    pBinLong("l", l); 
    pBinLong("~l", ~l); 
    pBinLong("-l", -l); 
    pBinLong("m", m); 
    pBinLong("l & m", l & m); 
    pBinLong("l | m", l | m); 
    pBinLong("l ^ m", l ^ m); 
    pBinLong("l << 5", l << 5); 
    pBinLong("l >> 5", l >> 5); 
    pBinLong("(~l) >> 5", (~l) >> 5); 
    pBinLong("l >>> 5", l >>> 5); 
    pBinLong("(~l) >>> 5", (~l) >>> 5); 
  } 
  static void pBinInt(String s, int i) { 
    System.out.println( 
      s + ", int: " + i + ", binary: "); 
    System.out.print("   "); 
    for(int j = 31; j >=0; j--) 
      if(((1 << j) &  i) != 0) 
        System.out.print("1"); 
      else 
        System.out.print("0"); 
    System.out.println(); 
  } 
  static void pBinLong(String s, long l) { 
    System.out.println( 
      s + ", long: " + l + ", binary: "); 
    System.out.print("   "); 
    for(int i = 63; i >=0; i--) 
      if(((1L << i) & l) != 0) 
        System.out.print("1"); 
      else 
        System.out.print("0"); 
    System.out.println(); 
  } 
}

 程序末尾调用了两个方法:pBinInt()和pBinLong()。它们分别操作一个int和long值,并用一种二进制格

 

式输出,同时附有简要的说明文字。目前,可暂时忽略它们具体的实现方案。 

大家要注意的是System.out.print()的使用,而不是System.out.println()。print()方法不会产生一个新

行,以便在同一行里罗列多种信息。 

除展示所有按位运算符针对int和long的效果之外,本例也展示了int和long的最小值、最大值、+1和-1

值,使大家能体会它们的情况。注意高位代表正负号:0为正,1为负。下面列出int部分的输出: 

-1, int: -1, binary:  

   11111111111111111111111111111111 

+1, int: 1, binary:  

   00000000000000000000000000000001 

  71

maxpos, int: 2147483647, binary:  

   01111111111111111111111111111111 

maxneg, int: -2147483648, binary:  

   10000000000000000000000000000000 

i, int: 59081716, binary:  

   00000011100001011000001111110100 

~i, int: -59081717, binary:  

   11111100011110100111110000001011 

-i, int: -59081716, binary:  

   11111100011110100111110000001100 

j, int: 198850956, binary:  

   00001011110110100011100110001100 

i & j, int: 58720644, binary:    00000011100000000000000110000100 

i | j, int: 199212028, binary:  

   00001011110111111011101111111100 

i ^ j, int: 140491384, binary:  

   00001000010111111011101001111000 

i << 5, int: 1890614912, binary:  

   01110000101100000111111010000000 

i >> 5, int: 1846303, binary:  

   00000000000111000010110000011111 

(~i) >> 5, int: -1846304, binary:  

   11111111111000111101001111100000 

i >>> 5, int: 1846303, binary:  

   00000000000111000010110000011111 

(~i) >>> 5, int: 132371424, binary:  

   00000111111000111101001111100000 

 

数字的二进制形式表现为“有符号2的补值”。 

分享到:
评论

相关推荐

    java 移位运算符的资源

    Java 移位运算符是编程语言中用于处理二进制位的一种高效操作方式,它们能够对整数类型(byte, short, int, long)的值进行左移、右移和无符号右移操作。理解这些运算符对于优化代码和深入理解计算机底层工作原理至...

    JAVA基础之java的移位运算

    - 当对byte或short类型进行移位操作时,它们会被提升为int类型,因此移位结果可能超出原始类型的范围,需要额外处理。 - 左移可能会导致符号位丢失,尤其是对负数左移过多位时。 - 右移时,如果原始值为负数,符号位...

    Java三种移位运算符原理解析

    Java中有三种移位运算符:左移运算符()、带符号右移运算符(&gt;&gt;)和无符号右移运算符(&gt;&gt;&gt;)。下面我们将详细介绍这三种移位运算符的原理和应用。 一、左移运算符() 左移运算符的作用是将指定值的所有位都左移...

    Java利用移位运算将int型分解成四个byte型的方法

    "Java利用移位运算将int型分解成四个byte型的方法" 以下是 Java 中利用移位运算将 int 型分解成四个 byte 型的方法...本文讲述了 Java 中利用移位运算将 int 型分解成四个 byte 型的方法,并对相关知识点进行了讲解。

    Java移位运算

    Java中提供了多种基本数据类型,如`byte`、`short`、`int`、`long`等,它们的存储方式决定了它们所能表示的值的范围。例如: - **Byte**: 占用8位(bit),取值范围为-128至127。 - **Short**: 占用16位,取值范围为-...

    Java中的位运算

    4. **byte和char进行移位运算**:当`byte`和`char`进行移位运算时不会发生错误,并且均按照整型进行计算,当计算结果超出`byte`或是`char`所能表示的范围时则进行相应的转换。 - 示例: ```java public class ...

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

    14. **带符号右移位运算符 (&gt;&gt;):** 根据符号位决定用0或1填充空出的位。 15. **无符号右移 (&gt;&gt;&gt;):** 总是用0填充空出的位,不考虑符号位。 16. **小于 (&lt;), 大于 (&gt;), 小于等于 (), 大于等于 (&gt;=):** 关系运算符,...

    java位运算.docx

    在Java中,所有的整数类型(byte, short, int, long)都是以补码形式存储的,其中最高位是符号位,0表示正数,1表示负数。补码的规则是正数的二进制表示不变,负数的二进制表示为其绝对值的补码按位取反再加1。 ...

    java位运算符之左移操作视频

    左移操作符()是位运算符之一,它在Java中有着特定的应用和理解。本篇文章将深入探讨Java中的左移操作符及其相关知识点。 一、位运算符概述 位运算符直接作用于二进制位,它们包括:左移(),右移(&gt;&gt;),无符号...

    java位运算符.pdf

    Java中的位运算符是针对整数类型数据进行操作的一组特殊运算符,它们直接作用于整数的二进制表示。这些整数类型包括long、int、short、char以及byte。位运算符主要包括按位非(NOT)、按位与(AND)、按位或(OR)、...

    java位运算大全.pdf

    此外,无符号右移运算符(&gt;&gt;&gt;)在Java中只适用于int和long类型,而对byte和short类型进行右移时,会自动将操作数扩展为int类型再进行运算。 Java语言还提供了位移赋值运算符,如、&gt;&gt;=和&gt;&gt;&gt;=,这些运算符将位移和赋值...

    2.java的基本数据类型运算符和流程控制选择题.docx

    - 在Java中,`switch`表达式可以是`byte`、`short`、`char`或`int`类型,也可以是枚举类型。 - **例题解析**: - A项:正确,`char`类型可以作为`switch`语句的表达式。 - B项:错误,`long`类型不能作为`switch...

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

    - 移位运算符在处理`Char`, `byte`, `short`类型时,会先转换为`int`类型,而`long`类型的移位结果仍为`long`类型。 了解这些运算符的优先级和目数对于编写高效且准确的Java代码至关重要。合理地使用运算符可以...

    lesson03-02 Java类基础知识--基本类型.ppt

    首先,布尔类型(boolean)是Java中的特殊类型,它只有两个可能的值:true和false,通常用于逻辑判断,其默认值为false。布尔类型在编程中广泛用于条件语句和循环控制。 接下来是字节类型(byte),占用1个字节(8...

    Java基础笔记-基础部分

    - 当操作数类型为`char`、`byte`、`short`和`int`时,结果为`int`。 - `+`还用于字符串连接。 - 乘法运算符:对基本数值类型进行相乘运算,结果类型取决于操作数类型。 - 除法运算符:对两个基本数值类型数据...

    第一章 java基础

    - **按位或**:只要有一个参与位运算的位为1时,位或运算就返回1。 - **按位非**:位运算中,非就是简单的取反,1变为0,0变为1。 - **左移位运算符**:` - **右移位运算符**:`&gt;&gt;` 30. **变量自增自减**:`a--...

    java基础.txt

    ` 这一行会导致编译错误,因为在进行加法运算时,Java会将byte类型的变量提升为int类型,然后进行运算。因此,结果也是一个int值,不能直接赋值给byte类型的变量。 - `byte b4 = 3 + 4;` 这种情况下编译器默认将...

    实验2 Java语言基础实验.doc

    在 Java 语言中,移位运算可以用于位运算和数值运算。移位运算可以分为左移位、右移位和无符号右移位。 实验中编写的程序可以正确地输出结果,但需要注意溢出和截断的问题。 三、结论 本实验涵盖了 Java 语言的...

    java葵花宝典.doc

    ` 错误是因为s1 + 1的结果会转换为int型,再赋值给short会有类型不匹配的编译错误。 - `short s1 = 1; s1 += 1;` 正确,因为Java会自动处理类型提升,这里的`+=`操作符会将结果适当地转换回short类型。 7. char型...

    JAVA自考课件第二单元

    Java中的赋值运算具有右结合性,即从右到左进行运算。同时,赋值运算符两侧的数据类型如果不同,Java会自动进行类型转换,遵循一定的类型优先级:byte, short, char -&gt; int -&gt; long -&gt; float -&gt; double。需要注意的...

Global site tag (gtag.js) - Google Analytics