Java 中的三重移位运算符2025年7月28日 | 阅读 8 分钟 在 Java 中,三元右移运算符(也称为位移运算符)由“>>>”表示,它是一种位操作运算符,可以将给定值的位向右移动指定的位数,用零填充最左边的位。与双右移运算符“>>”不同,“>>”会用原始值的符号位填充最左边的位,而三元右移运算符始终用零填充最左边的位。 简单来说,>>> 运算符将数字的位向右移动,就像 >> 一样,但它总是用 0 填充最左边的位,无论数字是正数还是负数。这使得它在某些底层按位操作中特别有用,在这些操作中,数字的符号不应影响结果。 请注意,“>>>”也被称为无符号右移运算符。Java 中不存在无符号左移运算符(“<<<”)。因为“<<<”的工作方式与左移运算符“<<”相同。 语法 三元右移运算符的语法如下: 其中,number 是要移位的数值,numBits 是要移位的位数,result 是移位操作的结果。 三元右移(>>>)运算符的工作原理使用整数数据类型考虑数字 -8。在二进制(32 位有符号整数)中,-8 的 2 的补码是: 现在,使用以下代码片段将移位 2 的 >>> 运算符应用于 -8: 二进制操作是: 原始 11111111 11111111 11111111 11111000 移位后 00111111 11111111 11111111 11111110 前导位(原来是 1,因为它是负数)现在被替换为 0。这会将原始的负数转换为一个大的正数。因此,最终输出是:1073741822 三元右移运算符与 long 数据类型与 int 类似,>>> 运算符也可以用于 long 值。在这种情况下,Java 将数字视为 64 位有符号值并相应地进行移位。 在这里,-1L 在二进制中表示为全为 1,使用 >>> 右移它,会在左边填充 0,使其有效地变成最大的 long 值。 三元右移运算符的必要性三元右移运算符在我们需要对无符号整数值执行逻辑右移的情况下特别有用。在 Java 中,整数值使用二的补码表示法,这意味着最左边的位用作符号位。这使得对无符号整数值执行逻辑右移变得困难,因为符号位会被移入最右边的位,从而有效地改变整数的值。 例如,考虑以下代码: 在这种情况下,x 最初设置为 -1,其二进制表示为 11111111 11111111 11111111 11111111。当我们使用双右移运算符按 1 位进行右移(“>>”)时,我们得到 11111111 11111111 11111111 11111111,仍然是 -1。因为符号位被移入最右边的位,从而保留了整数的负值。 但是,如果我们改用三元右移运算符(“>>>”),我们将得到不同的结果: 在这种情况下,移位操作后 x 的值为 01111111 11111111 11111111 11111111,即十进制的 2147483647。因为最左边的位被填充为 0 而不是 1,从而有效地将整数的值更改为正值。 示例编译并运行输出 x: -1 y: 2147483647 在此程序中,我们声明一个整数变量 x 并将其初始化为 -1,其二进制表示为 11111111 11111111 11111111 11111111。然后,我们使用三元右移运算符对 x 进行逻辑右移 1 位,并将结果存储在新整数变量 y 中。 最后,我们使用 System.out.println() 方法打印 x 和 y 的值。从输出可以看出,移位操作后 x 的值仍为 -1,而 y 的值现在为 2147483647。因为三元右移运算符用 0 填充了 x 的最左边位,从而有效地将其值更改为正整数。 总的来说,这个示例程序演示了如何在 Java 中使用三元右移运算符对无符号整数值执行逻辑右移并优化某些按位操作。 关于三元右移运算符的一个重要注意事项是,它在 Java 中的优先级低于算术、逻辑和按位运算符。这意味着它在这些运算符之后进行计算,如果需要,我们需要使用括号来控制计算顺序。 例如,考虑以下代码: 示例编译并运行输出 y: 32 z: 2 除以 2 的幂除了对无符号整数值执行逻辑右移外,三元右移运算符还可以用于优化某些按位操作,例如将有符号整数除以 2 的幂。 Java 中的三元右移运算符是一个有用的按位操作运算符,它允许我们对无符号整数值执行逻辑右移并优化某些按位操作。但是,应谨慎使用它,因为不当使用也可能导致意外行为。 考虑以下程序: 示例编译并运行输出 The value of x is: 4 The value of y is: 2 因此,我们可以得出结论,如果我们对整数应用三元右移运算符,那么我们总是会得到一个正值。 对于 16 这样的正数,>> 和 >>> 产生相同的结果。 对于 -16 这样的负数,>>> 得到一个大的正数,因为它将该数字视为无符号二进制序列。 为什么三元右移运算符有用?该运算符在以下情况下特别有用:
结论无符号右移运算符(在包括 Java 和 JavaScript 在内的不同语言中为 >>>,而在 C/C++ 中为 >>)将位向右移位,但与有符号右移(>>)不同,它总是用零填充空出的最左边位。无符号右移运算符将数字视为一个不是负数且无符号的整数,无论其原始符号如何。 三元右移运算符选择题1. 预测以下代码片段的输出。
答案: b) 解释:负值以二的补码形式表示。对于 -8,二的补码形式将是: -8(二的补码形式):11111111 11111111 11111111 11111000 向左移动一位后,将是:01111111 11111111 11111111 1111100,相当于 2147483644。 2. 当我们在处理文件或网络流等二进制数据时,为什么我们可能选择使用 >>> 运算符?
答案:c) 解释:三元右移运算符确保在移位时,最左边的位始终用 0 填充,无论输入数字的符号如何。 3. 以下程序的输出是什么?
答案:c) 解释:在这里,-1L 在二进制中表示为全为 1,使用 >>> 右移它,会在左边填充 0,使其有效地变成最大的 long 值。 4. 关于 Java 中的 >>> 运算符,以下哪个陈述是正确的?
答案: d) 解释:三元右移运算符将给定数字的位向右移动指定的位数,并用零填充空出的最左边位,无论数字的原始符号如何。 5. 当我们在 Java 中对正数使用 >>> 运算符时会发生什么?
答案: b) 解释:对于正数,三元右移运算符的工作方式类似于右移运算符。它将给定的数字除以 2 的幂。因此,22(我们右移两位)是 4,32 / 4 = 8。 下一主题条件运算符 Java |
java.text.FieldPosition 类包含 getBeginIndex() 函数。可以使用 FieldPosition 类获取 FieldPosition 对象的第一个字符的索引。语法:public int getBeginIndex() 参数:此方法可以传递的参数数量为零。返回值:FieldPosition 对象的索引...
阅读 2 分钟
两个排序数组的并集和交集是计算机科学和数据分析中的基本操作。在 Java 中,可以通过利用其固有的顺序来有效地对两个排序数组执行这些操作。两个数组的并集是所有元素的集合,这些元素...
14 分钟阅读
给我们一个整数计数,与一个由小写英文字母组成的字符串 'str' 相关联。此特定问题的目标是查找“相等计数子串”。当子串中的每个不同字母都出现恰好 count 次时,该子串称为...
阅读 6 分钟
Java 中的量词是至关重要的概念,尤其是在正则表达式的上下文中。它们指定了输入中必须存在的字符、组或字符类的实例数量才能找到匹配项。在本节中,我们将…
阅读 4 分钟
填字游戏几十年来一直是流行的娱乐和脑力锻炼形式。这些谜题挑战玩家在一系列字母的网格中找到隐藏的单词。随着技术的进步,解决填字游戏的问题已进入……
7 分钟阅读
?借助 Java 的动态 SQL 查询,我们可以即时创建和执行 SQL 语句,为数据库交互提供灵活性和适应性。在本节中,我们将讨论在 Java 中编写动态 SQL 查询的过程,包括全面的代码示例……
5 分钟阅读
尼文数(Niven numbers)以加拿大数学家伊万·尼文(Ivan Niven)的名字命名,他于 1977 年在一篇论文中介绍了它们。然而,它们最早是由印度数学家 D. R. Kaprekar 在 20 世纪 50 年代研究的。在本节中,我们将学习什么是尼文数以及示例……
5 分钟阅读
java.nio.DoubleBuffer 有 order() 函数。可以使用 DoubleBuffer 类获取此 DoubleBuffer 实例的 ByteOrder。语法:public abstract ByteOrder order()返回值:此函数返回此缓冲区的字节顺序。示例 1:代码展示了如何管理和检查内容……
阅读 2 分钟
?Java Development Kit (JDK) 是创建基于 Java 的计算机程序的重要工具。它提供了开发人员构建 Java 程序和 Applet 所需的所有工具和资源。Java Development Kit (JDK) 结合了 Java 虚拟机 (JVM) 和 Java Runtime……
阅读 4 分钟
问题陈述:我们给出了三个字符串 str1、str2、str3。我们需要找到出现在三个给定字符串中顺序相同但不一定连续的最长公共子序列。两个或多个字符串的公共子序列是公共的子序列……
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India