public class Test {
public static void main(String args[]) {
byte b = (byte) 0xf1;
byte c = (byte) (b >> 4);
byte d = (byte) (b >>> 4);
byte e = (byte) ((b & 0xff) >> 4);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
}
}
以上结果是:
-15
-1
-1
15
貌似无符号右移失效了,变成有符号右移了,这是怎么回事呢,原因是java双目运算符参与运算时操作数被提升为int了,看一解释:
byte a = -64;
byte b = (byte)(a >>> 4);
这里 a = 11000000b,那么无符号右移4位的结果应为 00001100b,即 b = 12。但是实际的执行结果为 b = -4,即 11111100b。
得到这个错误结果的原因是,Java中任何双目运算的运算数都会首先被扩展为 int,然后再进行运算。在这里运算过程如下:
byte 型 11000000
扩展为 int 型 11111111 11111111 11111111 11000000
无符号右移4位 00001111 11111111 11111111 11111100
强制转换为 byte 型 11111100
从上面的过程中我们可以得出结论,对于比int还要小的数值类型(short、byte)不应当进行无符号右移运算。
分享到:
相关推荐
在JavaScript编程语言中,右移运算符是用来处理二进制数据的一种操作,它有三种形式:无符号右移(>>>)、有符号右移(>>)和算术右移(>>>)。这里我们主要讨论的是无符号右移赋值操作符 `>>>=`。这个运算符在进行...
Java 位运算是编程语言中的一种底层操作,它允许我们直接对整数类型的数据进行按位操作,包括按位与(&)、按位或(|)、按位异或(^)、按位非(~)以及左移()、右移(>>)和无符号右移>>>。这些操作在处理二进制数据、优化...
"Java 无符号右移与右移运算符的使用介绍" Java 无符号右移与右移运算符是 Java 编程语言中两个重要的操作符,它们在位运算中扮演着关键的角色。理解这两个操作符的使用方法和区别对于 Java 开发者来说是非常重要的...
Java中的移位操作符用于对二进制数进行左移()、右移(>>)和无符号右移(>>>)操作。 左移()操作符:将一个数的所有位向左移动指定的位数,右侧空出的位用0填充。 右移(>>)操作符:将一个数的所有位向右移动...
无符号右移>>>同样将操作数向右移动指定的位数,但左侧用零填充,不管原来的符号位是什么。 总而言之,Java语言的强大功能和灵活性是通过其独特的运行环境和编译执行模式来实现的。了解JVM、JDK和JRE的工作原理对于...
3. **无符号右移>>>**:无论正负,所有空出来的位都用0填充。无符号右移只适用于不关心符号的位移情况。 面向对象编程(OOP)是另一种重要的编程范式,与过程化编程相比,OOP更注重数据结构(对象的状态)和操作...
7. **无符号右移>>>**: 不论正负,所有位都向右移动,左侧用0填充。无符号右移适用于处理无符号整数,不会改变数值的符号。 位运算在Java中尤其有用,例如在处理位标志、内存限制下的数据存储、高效的位图操作以及...
7. **无符号右移>>>**:在某些实现中,C语言提供无符号右移,即使对于负数,右边也会用0填充,保持数值的无符号性质。但这并非所有环境都支持,标准C语言中没有明确规定。 位运算在处理位标志、内存映射、数据压缩...
无符号右移 >>>= 要求 版本信息 条件(三目)运算符 (?:) 根据条件执行两个语句中的其中一个。 test ? 语句1 : 语句2 参数 test 任何 Boolean 表达式。 语句1 当 test 是 true 时执行的语句。可以是复合语句。 语句2...
3. 无符号右移 >>>。 java 中的数组: 1. java 中一维数组在定义的时候是不能够分配空间的,例如:int num[];// 中括号中不能写大小。 2. 只有在定义完成之后为数组分配大小,例如:num = new int[3];。 3. java ...
9. 移位操作符:C#缺少无符号右移>>>。 10. goto语句:C#支持goto,但使用谨慎,Java不支持。 11. 数组声明:C#的数组声明中,[]必须紧跟类型,而不是变量名。 12. 命名空间别名:C#允许使用using语句为命名空间指定...
7. 无符号右移>>>:无论操作数的符号位如何,都用0填充移出的空位。 二、位操作的应用 1. 数据存储优化:对于只需要存储少量状态或标志位的情况,使用位操作可以节省内存空间,如位字段表示。 2. 高效计算:位操作...
2. Java中的无符号右移>>>运算符将整数的二进制位向右移动指定的位数。对于负数,高位补1。因此,如果int a=-2(二进制表示为11111111 11111111 11111111 11111010),则a>>>3的结果为8(二进制表示为00000000 ...
2. **位操作符**:Java提供了位操作符,如按位与(&),按位或(|),按位异或(^),按位左移(),按位右移(>>),无符号右移>>>,这些都是实现ALU的关键。 3. **数据类型**:ALU处理的是二进制数据,因此,我们可能需要...
本文将深入探讨“Test_shr_long.rar_verify”这个主题,它涉及到Java语言中的位移操作,特别是无符号右移(>>>)操作,并关注如何确保位移距离在0到64之间,这是保证代码正确性和效率的关键。 首先,让我们解释一下...
无符号右移>>>将二进制数向右移动指定位置,高位用0填充。8的二进制表示为1000,向右移2位后为010,转换为十进制即为4。 6. 下列程序类Test中,要插入的正确代码是:(B. static void doSomething(int... args){}...
无符号右移>>>对于负数会将高位用0填充,但-1>>>32依然为-1,因为-1在二进制表示中所有位都是1。 8. 字符串连接:`String s = "s"; s += c;`的结果是"sc",因为字符串是不可变的,s+=c实际上创建了一个新的字符串...
在Java中,无符号右移>>>运算符会将二进制表示的负数右移,高位补0,因此-2(10000000)右移3位后变成00000010,其十进制值为2。 3. 对数组元素的引用错误的是(C)a[3]。Java数组的索引从0开始,所以a[3]实际上...
7. 无符号右移>>>:无论正负,都用0填充左侧空出的位。 位操作通常用于高效地处理内存中的原始数据,如在内存有限的设备上存储和读取数据,或者实现特定的算法,如快速计算数字的二进制表示。 二、BitUtils工具库 ...