`

无符号右移>>>

阅读更多
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)不应当进行无符号右移运算。

分享到:
评论

相关推荐

    java 移位操作符的使用

    Java中的移位操作符用于对二进制数进行左移()、右移(>>)和无符号右移(>>>)操作。 左移()操作符:将一个数的所有位向左移动指定的位数,右侧空出的位用0填充。 右移(>>)操作符:将一个数的所有位向右移动...

    JavaScript 无符号右移赋值操作

    无符号右移赋值操作 (>>>=)是对变量值根据表达式值所规定的位数进行无符号右移,并将结果赋给该变量。

    进制转换C源码

    进制转换C源码 根据毕向东Java基础教程中讲解的进制转换原理写出来的C语言代码,C语言还是和Java差别太大,没有无符号右移>>>太难搞了,不过还算搞定了吧

    JavaScript 入门JavaScript 具有全范围的运算符

    无符号右移 >>>= 要求 版本信息 条件(三目)运算符 (?:) 根据条件执行两个语句中的其中一个。 test ? 语句1 : 语句2 参数 test 任何 Boolean 表达式。 语句1 当 test 是 true 时执行的语句。可以是复合语句。 语句2...

    Java 无符号右移与右移运算符的使用介绍

    主要介绍了Java 无符号右移与右移运算符的使用介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    JavaScript 无符号右移运算符

    无符号右移运算符 (>>>)是右移表达式的位,不保留符号。

    VC 无符号大整数类计算方法.rar

    VC 无符号大整数类计算方法,作者:缪元虎,四川绵阳供电局,重载的减法运算符,因为是无符号数,所以结果为大数减小数得到的差,乘2运算,即// a = a * 2^dwTimes; 相当于左移一位二进制,低位补0,除2运算;相当于...

    javascript中负数算术右移、逻辑右移的奥秘探索

    javascript中负数的算术右移和逻辑右移都十分的让人迷惑,特别是逻辑右移>>>,你会发现即使一个很小的负数,右移之后,也会得到一个无比巨大的数,这是为什么呢? 原来在逻辑右移中符号位会随着整体一起往右移动,...

    vs没报错leetcode报错-JavaDataStructure_Algorithm:这个repo包含我目前正在学习的java笔记和leet

    无符号右移 汉明权重 - 它包含的设置位数的计数 词汇 设置位 - 1 清除位 - 0 最重要的位 - 最左边的位 最不重要的位 - 最右边的位 无符号与有符号整数 有符号整数可以存储正负。 无符号整数只能存储正数 参考 汉明...

    FPGA2cpu_verilog语言设计实现cpu的源码

    支持有符号和无符号整数加、减、乘、除运算,并支持浮点数加、减、乘、除四种运算,支持与、或、异或、非4种逻辑运算,支持逻辑左移、逻辑右移、算术右移、循环右移4种移位运算,支持Load/Store操作,支持地址/立即...

    易语言取文件版本模块

    易语言取文件版本模块源码,取文件版本模块,无符号右移,取文件版本,交换_整数_文件信息,GetFileVersionInfoSize,GetFileVersionInfo,HeapAlloc,GetProcessHeap,HeapFree,VerQueryValue

    VC++数论计算的无符号大整数类及范例

    内容索引:VC/C++源码,算法相关,数论计算 VC++数论计算的无符号大整数类及范例,利用空闲时间编写了一个用于数论计算的无符号大整数类:   //乘2运算,即   // a = a * 2^dwTimes; 相当于左移一位二进制,低位补0 ...

    c代码-编写一个函数 rightrot(x, n),该函数返回将 x 循环右移(即从最右端 移出的位将从最左端移入)n(二进制)位后所得到的值。

    c代码-编写一个函数 rightrot(x, n),该函数返回将 x 循环右移(即从最右端 移出的位将从最左端移入)n(二进制)位后所得到的值。

    算法心得:高效算法的奥秘(原书第2版).[美]Henry S.Warren,Jr(带详细书签).pdf

    2.7 用无符号右移模拟带符号右移操作 20 2.8 符号函数 21 2.9 三值比较函数 21 2.10 符号传递函数 22 2.11 将值为0的位段解码为2的n次方 22 2.12 比较谓词 23 2.12.1 利用进位标志求比较谓词 26 2.12.2 ...

    Java byte 位移操作 注意事项

    & | ^ (加,减,乘,除,右移,左移,无符号右移,位与,位或,位异或)操作,均会是首先将byte转化为int, 再行运算。这一事实可能导致多种问题:  假设我们想进行如下byte运算: 1111 1000 右移1位,再与0000 ...

    C语言位运算符:与、或、异或、取反、左移与右移详细介绍

    这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。 C语言提供的位运算符列表:运算符 含义 描述& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0| 按位或 两...

    JAVA基础之java的移位运算

    例如,如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(sign extension ),在进行右移操作时用来保持负数的符号。例如,–8 >> 1 是...

    JavaScript位移运算符(无符号) 三个大于号 的使用方法详解

    d3.bisector(accessor)是一种指定参数accessor或者比较器函数返回一个二等分对象...N>>>1就代表N的二进制右移一位,二进制右移一位就能得到中间值。 例如 10>>>1 10的二进制代码为 1010 向右移动一位后为 0101 即 5

Global site tag (gtag.js) - Google Analytics