当前位置: 首页 > 编程笔记 >

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

杜鸿彩
2023-03-14
本文向大家介绍Java 无符号右移与右移运算符的使用介绍,包括了Java 无符号右移与右移运算符的使用介绍的使用技巧和注意事项,需要的朋友参考一下

Java 无符号右移介绍

 最近学习Java,看到>>>运算符不太了解,也百度查了查,解释得不是很清晰。那么下面讲解我对>>>运算符的认识: >>>运算符:无符号右移运算符 在学习>>>无符号右移运算符前,我们先了解右移运算符>>

下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13:

操作符 描述 例子
如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即0000 1100
| 如果相对应位都是0,则结果为0,否则为1 (A | B)得到61,即 0011 1101
^ 如果相对应位值相同,则结果为0,否则为1 (A ^ B)得到49,即 0011 0001
按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 (〜A)得到-61,即1100 0011
<< 按位左移运算符。左操作数按位左移右操作数指定的位数。 A << 2得到240,即 1111 0000
>> 按位右移运算符。左操作数按位右移右操作数指定的位数。 A >> 2得到15即 1111
>>> 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 A>>>2得到15即0000 1111

右移运算符

>>右移运算符:正数高位补0,负数高位补1

看一个例子:

public static void main(String[] args) {
    /**
     * 10的二进制:1010
     * 因为是正数,所以计算机高位的0不会输出
     * 负数会输出32位bit
     */
    System.out.println(Integer.toBinaryString(10 >> 2));
    System.out.println(Integer.toBinaryString(-10));
    System.out.println(Integer.toBinaryString(-10 >> 2));
  }

输出:


计算机计算数据以补码的方式进行计算
正数原码、反码、补码不变
负数(-10):以8bit(位)表示
原码----> 1000 1010
反码----> 1111 0101(符号位不变,其他位取反)
补码----> 1111 0110(反码基础上 + 1)
所以会 -10 会输出:1111…0110
-10 >> 2 :1111…1101(高位补1)
10 >> 2:0000…0010

无符号右移运算符

>>> 无符号右移运算符与 >> 右移运算符的正数相同,只不过关键在于负数的不同,>>>运算符右移:**负数高位补 0 ,其它位不变**

看一个例子:

public static void main(String[] args) {
    System.out.println(Integer.toBinaryString(10 >>> 2));
    System.out.println(Integer.toBinaryString(-10));
    System.out.println(Integer.toBinaryString(-10 >>> 2));
  }

输出:(注意和以上例子比较)


解释


总结:
>>> 和 >> 的区别在于:

  • >>> 负数高位补 0;
  • >> 负数高位补1;

 左移运算符   <<

左移的规则只记住一点:该数对应的二进制码补码整体左移,丢弃最高位,0补最低位

如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位;

当左移的运算数是int 类型时,每移动1位它的第31位(0~31)就要被移出并且丢弃;
当左移的运算数是long 类型时,每移动1位它的第63(0~63)位就要被移出并且丢弃。
当左移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型。

正数和负数的左移操作分两种情况:

(1)左移n位(1<=n<=31)之后操作数没有溢出

         这种情况等价于===原操作*2^n,例如60的二进制补码是 111100=2^5+2^4+2^3+2^2=60

60左移25位之后的二进制补码为:01111000000000000000000000000000 =(2^5+2^4+2^3+2^2)*2^25=2^30+2^29+2^28+2^27

而int类型占四个字节,一共三十二位,第一位是符号位,int类型的数值范围是(-2^31~2^31-1)所以60左移25位操作数没有溢出,最高位还是0;

(2)左移n位(1<=n<=31)之后操作数溢出

但如果再向左移动一位的话,即60左移26位之后的二进制补码为:

11110000000000000000000000000000 =(2^5+2^4+2^3+2^2)*2^26=2^31+2^30+2^29+2^28

此时二进制最高位是1,操作数溢出,变成负数。

60移位前二进制(补码表示):
111100  60
-60移位前二进制(补码表示):
11111111111111111111111111000100  -60
 
左移的规则只记住一点:丢弃最高位,0补最低位
60左移1位的二进制(补码表示):
1111000  120
60左移25位的二进制(补码表示):
1111000000000000000000000000000  2013265920
60左移26位的二进制(补码表示):
11110000000000000000000000000000  -268435456
60左移30位的二进制(补码表示):
0  0
-60左移1位的二进制(补码表示):
11111111111111111111111110001000  -120
-60左移25位的二进制(补码表示):
10001000000000000000000000000000  -2013265920
-60左移26位的二进制(补码表示):
10000000000000000000000000000  268435456
-60左移32位的二进制(补码表示):
11111111111111111111111111000100  -60

到此这篇关于Java 无符号右移与右移运算符的使用介绍的文章就介绍到这了,更多相关Java 无符号右移与右移运算符内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 问题内容: 无符号右移运算符在最左边插入0。所以当我这样做 输出 因此,它将在最左边的位中插入0。 输出 不应该是0吗? 问题答案: 参见http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19 如果左侧操作数的提升类型为int,则仅将右侧操作数的最低5位用作移位距离。就像右侧操作数受到掩码值0x1f(0b1111

  • 问题内容: 如何在SQL Server中编写无符号右移运算符?表情就像 这是例如 -5381 >>> 0 = 4294961915 问题答案: T-SQL没有移位运算符,因此您必须自己实现。这里有一个按位移位的实现:http : //dataeducation.com/bitmask- handling-part-4-left-shift-and-right-shift/ 您必须将整数强制转换为v

  • 为了在Swift中实现这一点,我将通过执行以下操作来获取除符号位以外的所有位, 注意数字必须是负数!如果shift操作符溢出,应用程序就会随着EXC_BAD_INSTRUCTION崩溃,这不是很好...另外,我是故意使用Int64的。因为没有更大的数据类型,所以执行类似(1<<63)的操作会溢出Int64并崩溃。因此,我没有在更大的数据类型中执行((1<<63)-1+negativeNumber)

  • 简单的问题:为什么如果我在Java中对字节变量应用无符号右移(也是短的),它就像int一样威胁它: 控制台输出:

  • 问题内容: 我了解Java中的无符号右移运算符“ >>>”是什么,但是为什么我们需要它,为什么我们不需要相应的无符号左移运算符? 问题答案: 该运营商允许你将和为32位和64位 无符号 整型,这是从Java语言缺少的。 当您移动不代表数值的内容时,这很有用。例如,您可以使用32位s 表示黑白位图图像,其中每个位图在屏幕上编码32个像素。如果需要将图像向右滚动,则希望将an左侧的位变为零,以便可以轻

  • 在我的系统中,在二进制(十进制255)中是(预期是8位字符)1111 1111。 类似地,如预期的0111 1111。左边填满了一个零。 是预期的1000 0000。 例如,现在我想生成未签名的字符0010 0000。 我尝试了,但输出1110 0000....怎么了?为什么左边突然被一个塞满了? 如何生成启用第N位(从左侧开始)的? 我想 此刻,正在给我 对于、存在此问题,但对于或更高版本不再发

  • 问题内容: 在将其标记为重复项之前,请阅读以下内容,并检查 我的代码 * 我更新的代码! 所以我的问题是,我必须实现Java / JavaScript’>>>’(无符号右移/零填充右移),但是我无法以完全相同的方式工作。 我选择了在SO和Web上找到的11个最有前途的实现(链接在代码中作为注释添加),并添加了一些测试用例。不幸的是 无 功能返回的Java / JS相同响应的测试ALL。 (也许其中

  • 为什么无符号右移(逻辑右移)和有符号右移(算术右移)对负数产生相同的结果? Android Studio Logcat输出