Java 中,`1 << 1`

在 Java 中,1 << 1按位左移运算 ,核心作用是将数字 1 的二进制位向左移动 1 位,本质是对数字进行 乘以 2 的 1 次方 运算(左移 n 位等价于乘以 2ⁿ,前提是不溢出)。下面从「运算规则、二进制过程、实际效果、注意事项」四个维度详细拆解:

一、先明确:按位左移(<<)的基本规则

按位左移运算符 << 的语法是 a << n,表示:

  1. 将整数 a 转换成 二进制补码形式(Java 中所有整数都是补码存储,正数补码=原码,负数补码需计算);
  2. 把二进制位整体 向左移动 n
  3. 左边移出的高位直接丢弃;
  4. 右边空出的低位 补 0
  5. 结果仍为整数(int 或 long 等,取决于操作数类型)。

二、1 << 1 的分步计算过程

步骤 1:确定 1 的二进制形式

Java 中默认整数是 int 类型(32 位),1 是正数,其 32 位二进制原码(=补码)为:

复制代码
0000 0000 0000 0000 0000 0000 0000 0001

(为了直观,用空格分隔每 4 位,实际存储时无空格)

步骤 2:执行左移 1 位

将所有二进制位向左移动 1 位:

  • 左边最高位的 0 被移出(丢弃,无影响);
  • 右边空出的 1 位补 0

移动后的 32 位二进制为:

复制代码
0000 0000 0000 0000 0000 0000 0000 0010
步骤 3:转换回十进制

二进制 0000...0010 对应的十进制是 2,因此 1 << 1 = 2

三、拓展:左移的核心规律(不止 1 << 1

左移 n 位的本质是 乘以 2ⁿ(仅对正数或无符号数成立,且不溢出时),比如:

  • 1 << 0:左移 0 位,结果还是 1(1 × 2⁰ = 1);
  • 1 << 2:左移 2 位,二进制 0000...0100,结果 4(1 × 2² = 4);
  • 1 << 3:左移 3 位,二进制 0000...1000,结果 8(1 × 2³ = 8);
  • 2 << 1:左移 1 位,二进制 0000...00100000...0100,结果 4(2 × 2¹ = 4)。

这个规律让左移成为 高效的"乘以 2 的幂"运算------CPU 执行按位运算比乘法运算快得多,因此底层代码(如集合扩容、位掩码)中常用左移替代乘法。

四、关键注意事项

1. 左移位数的"取模规则"

Java 中,若左移位数 n 超过操作数的位数(如 int 32 位、long 64 位),会自动对 n 取模(避免无效移动):

  • int 类型:n = n % 32(例:1 << 33 等价于 1 << 1,结果还是 2);
  • long 类型:n = n % 64(例:1L << 65 等价于 1L << 1,结果 2L)。
2. 溢出问题(左移的"陷阱")

左移时若高位移出的是 1(正数左移过多、或负数左移),会导致 数值溢出,结果可能变成负数(因为 int/long 的最高位是符号位:0=正数,1=负数)。

示例:1 << 31(int 类型)

  • 1 的 32 位二进制左移 31 位后:1000 0000 0000 0000 0000 0000 0000 0000
  • 最高位是 1(符号位),对应的十进制是 -2147483648(int 类型的最小值),而非 2³¹2³¹ 已超出 int 范围)。
3. 负数的左移

负数的左移同样遵循"左移补 0"规则(补码形式操作),结果仍是负数(符号位始终为 1),且等价于"乘以 2ⁿ"(不溢出时):

  • 例:-2 << 1-2 的补码是 1111...1110);
  • 左移 1 位后补码:1111...1100,对应的十进制是 -4-2 × 2¹ = -4)。

五、实际应用场景

1 << n 最常用的场景是 创建位掩码(通过单个bit的置1表示特定状态),例如:

java 复制代码
// 用 1<<0 表示状态A(第0位为1)
final int FLAG_A = 1 << 0; // 二进制 0001 → 十进制 1
// 用 1<<1 表示状态B(第1位为1)
final int FLAG_B = 1 << 1; // 二进制 0010 → 十进制 2
// 用 1<<2 表示状态C(第2位为1)
final int FLAG_C = 1 << 2; // 二进制 0100 → 十进制 4

// 组合状态(按位或 |):同时开启A和B
int status = FLAG_A | FLAG_B; // 二进制 0011 → 十进制 3
// 判断是否包含状态B(按位与 &)
boolean hasB = (status & FLAG_B) != 0; // true

总结

1 << 1 的本质是 将 1 的二进制左移 1 位补 0 ,结果为 2,等价于 1 × 2¹。理解它的核心是掌握"按位左移的补 0 规则"和"左移与 2ⁿ 乘法的关联",同时注意溢出和位数取模的细节。在实际开发中,左移常用来优化乘法运算或实现位掩码逻辑。

相关推荐
总有刁民想爱朕ha7 分钟前
零基础Python开发「图片批量转MP4视频」工具,本地离线、免费无水印
开发语言·python·音视频
l1t14 分钟前
测试DuckDB luajit插件读取本地通达信文件
开发语言·数据库·duckdb
老一岁30 分钟前
c问题总结(2)
c语言·开发语言
Ming_studying30 分钟前
Python批量压缩图片:支持JPG_PNG_WebP、尺寸限制与CSV报告
开发语言·图像处理·python·pillow·图片压缩
风月说与山鬼35 分钟前
JS闭包详解
开发语言·javascript
何以解忧,唯有..35 分钟前
Python协程详解:从生成器到async/await的完整指南
开发语言·python
奶茶树40 分钟前
【C++】13. C++11新特性【上】
c语言·开发语言·c++·git·github
SomeB1oody44 分钟前
【RustyML入门】7.4. 按需裁剪与模块化集成
开发语言·后端·机器学习·rust·教程
吴声子夜歌1 小时前
Java面试——数据结构(一)
java·数据结构·面试
罗超驿1 小时前
SpringBoot 快速入门
java·spring boot·后端