深入理解 Java 中的移位运算符

移位运算符是 Java 中的一种位运算符,用于将数字的二进制位向左或向右移动。它们直接作用于二进制数据,常用于快速算术运算和底层位操作。

Java 提供了以下三种移位运算符:

1. 有符号左移运算符 (<<)

左移运算符将数字的位向左移动指定的位置。在右侧补零。

#### 语法:

> left_operand << number

class GFG {
    public static void main(String[] args) {
        byte a = 64, b;
        int i;
        i = a << 2;
        b = (byte) (a << 2);
        System.out.println("Original value of a: " + a);
        System.out.println("i and b: " + i + " " + b);
    }
}

Output

Original value of a: 64
i and b: 256 0

说明:

  • a << 2 将 a 的位向左移动两个位置,实际上相当于将其乘以 4。
  • 结果存储在 int 类型的变量 i 中,保留了完整的值。
  • 当同一个结果被强制转换为 byte 并存储在 b 中时,由于 byte 的范围有限,发生了溢出
  • 输出结果突出了将位移操作存入 int 与强制转换回 byte 之间的区别。

2. 有符号右移运算符 (>>)

右移运算符将位向右移动。符号位(最高有效位 MSB)会被复制填充到空出的位置,从而保持数字的正负号不变。

#### 语法:

> left_operand >> number

class GFG {
    public static void main(String[] args) {
        int number = 8;

        int ans = number >> 2;
        System.out.println(ans);
    }
}

Output

2

说明:

  • number >> 2 将 number 的位向右移动两个位置。
  • 右移操作会丢弃最低的两位,并用符号位填充左侧。
  • 对于 8(二进制 1000),向右移动 2 位的结果是 2(二进制 0010),并将其打印出来。
class GFG {
    public static void main(String[] args) {
        char hex[] = {
            ‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,
            ‘8‘,‘9‘,‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘
        };
        byte b = (byte) 0xf1;
        System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
    }
}

Output

b = 0xf1

说明:

  • hex 数组存储了十六进制字符(0–f)。
  • byte 变量 b 被赋值为一个十六进制值(0xf1)。
  • (b >> 4) & 0x0f 提取高 4 位,b & 0x0f 提取低 4 位。
  • 这些值被用作 hex 数组的索引,以十六进制格式打印该字节。

3. 无符号右移运算符 (>>>)

无符号右移运算符将位向右移动,无论数字的符号如何,左侧空出的位都用 0 填充。

#### 语法:

> left_operand >>> number

class GFG {
    public static void main(String[] args) {
        byte num1 = 8;
        byte num2 = -8;
        System.out.println(num1 >>> 2);
        System.out.println(num2 >>> 2);
    }
}

Output

2
1073741822

说明:

  • 对于正数,>> 和 >>> 的行为是相同的。
  • 对于负数,>>> 在左侧填充 0,从而产生一个巨大的正数值。

4. Java 中的无符号左移运算符

Java 没有提供无符号左移运算符(<<<),原因是:

  • 左移操作(<<)总是插入 0 位。
  • 在 Java 中,逻辑左移和算术左移是完全相同的。

相关文章

> – Java 中的位运算符

> – Java 中的运算符

> – Java 数字转换程序

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/29197.html
点赞
0.00 平均评分 (0% 分数) - 0