在进行位操作时有哪些详细规则呢?在看完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 移位运算符是编程语言中用于处理二进制位的一种高效操作方式,它们能够对整数类型(byte, short, int, long)的值进行左移、右移和无符号右移操作。理解这些运算符对于优化代码和深入理解计算机底层工作原理至...
- 当对byte或short类型进行移位操作时,它们会被提升为int类型,因此移位结果可能超出原始类型的范围,需要额外处理。 - 左移可能会导致符号位丢失,尤其是对负数左移过多位时。 - 右移时,如果原始值为负数,符号位...
Java中有三种移位运算符:左移运算符()、带符号右移运算符(>>)和无符号右移运算符(>>>)。下面我们将详细介绍这三种移位运算符的原理和应用。 一、左移运算符() 左移运算符的作用是将指定值的所有位都左移...
"Java利用移位运算将int型分解成四个byte型的方法" 以下是 Java 中利用移位运算将 int 型分解成四个 byte 型的方法...本文讲述了 Java 中利用移位运算将 int 型分解成四个 byte 型的方法,并对相关知识点进行了讲解。
Java中提供了多种基本数据类型,如`byte`、`short`、`int`、`long`等,它们的存储方式决定了它们所能表示的值的范围。例如: - **Byte**: 占用8位(bit),取值范围为-128至127。 - **Short**: 占用16位,取值范围为-...
4. **byte和char进行移位运算**:当`byte`和`char`进行移位运算时不会发生错误,并且均按照整型进行计算,当计算结果超出`byte`或是`char`所能表示的范围时则进行相应的转换。 - 示例: ```java public class ...
14. **带符号右移位运算符 (>>):** 根据符号位决定用0或1填充空出的位。 15. **无符号右移 (>>>):** 总是用0填充空出的位,不考虑符号位。 16. **小于 (<), 大于 (>), 小于等于 (), 大于等于 (>=):** 关系运算符,...
在Java中,所有的整数类型(byte, short, int, long)都是以补码形式存储的,其中最高位是符号位,0表示正数,1表示负数。补码的规则是正数的二进制表示不变,负数的二进制表示为其绝对值的补码按位取反再加1。 ...
左移操作符()是位运算符之一,它在Java中有着特定的应用和理解。本篇文章将深入探讨Java中的左移操作符及其相关知识点。 一、位运算符概述 位运算符直接作用于二进制位,它们包括:左移(),右移(>>),无符号...
Java中的位运算符是针对整数类型数据进行操作的一组特殊运算符,它们直接作用于整数的二进制表示。这些整数类型包括long、int、short、char以及byte。位运算符主要包括按位非(NOT)、按位与(AND)、按位或(OR)、...
此外,无符号右移运算符(>>>)在Java中只适用于int和long类型,而对byte和short类型进行右移时,会自动将操作数扩展为int类型再进行运算。 Java语言还提供了位移赋值运算符,如、>>=和>>>=,这些运算符将位移和赋值...
- 在Java中,`switch`表达式可以是`byte`、`short`、`char`或`int`类型,也可以是枚举类型。 - **例题解析**: - A项:正确,`char`类型可以作为`switch`语句的表达式。 - B项:错误,`long`类型不能作为`switch...
- 移位运算符在处理`Char`, `byte`, `short`类型时,会先转换为`int`类型,而`long`类型的移位结果仍为`long`类型。 了解这些运算符的优先级和目数对于编写高效且准确的Java代码至关重要。合理地使用运算符可以...
首先,布尔类型(boolean)是Java中的特殊类型,它只有两个可能的值:true和false,通常用于逻辑判断,其默认值为false。布尔类型在编程中广泛用于条件语句和循环控制。 接下来是字节类型(byte),占用1个字节(8...
- 当操作数类型为`char`、`byte`、`short`和`int`时,结果为`int`。 - `+`还用于字符串连接。 - 乘法运算符:对基本数值类型进行相乘运算,结果类型取决于操作数类型。 - 除法运算符:对两个基本数值类型数据...
- **按位或**:只要有一个参与位运算的位为1时,位或运算就返回1。 - **按位非**:位运算中,非就是简单的取反,1变为0,0变为1。 - **左移位运算符**:` - **右移位运算符**:`>>` 30. **变量自增自减**:`a--...
` 这一行会导致编译错误,因为在进行加法运算时,Java会将byte类型的变量提升为int类型,然后进行运算。因此,结果也是一个int值,不能直接赋值给byte类型的变量。 - `byte b4 = 3 + 4;` 这种情况下编译器默认将...
在 Java 语言中,移位运算可以用于位运算和数值运算。移位运算可以分为左移位、右移位和无符号右移位。 实验中编写的程序可以正确地输出结果,但需要注意溢出和截断的问题。 三、结论 本实验涵盖了 Java 语言的...
` 错误是因为s1 + 1的结果会转换为int型,再赋值给short会有类型不匹配的编译错误。 - `short s1 = 1; s1 += 1;` 正确,因为Java会自动处理类型提升,这里的`+=`操作符会将结果适当地转换回short类型。 7. char型...
Java中的赋值运算具有右结合性,即从右到左进行运算。同时,赋值运算符两侧的数据类型如果不同,Java会自动进行类型转换,遵循一定的类型优先级:byte, short, char -> int -> long -> float -> double。需要注意的...