在Java编程语言中,位运算符是一种对整数在二进制层面进行操作的工具。其中,左移运算符(<<
)是一个非常重要的成员,它将一个数的所有二进制位向左移动指定的位数,同时在右侧补充0。
例如,对于整数1(二进制表示为00000000 00000001
),执行1 << 1后得到的结果是2(二进制表示为00000000 00000010
),因为它的二进制形式向左移动了一位。
下面列举出从0到20使用左移运算符的效果:
1 << 0 = 00000000 00000001 (结果为 1) 1 << 1 = 00000000 00000010 (结果为 2) 1 << 2 = 00000000 00000100 (结果为 4) 1 << 3 = 00000000 00001000 (结果为 8) 1 << 4 = 00000000 00010000 (结果为 16) ... 1 << 11 = 00010000 00000000 (结果为 2048) 注意到,由于我们原始数值是1,所以每次左移一位相当于乘以2。
有趣的是,我们可以结合左移运算符和按位或运算符(|
)来模拟加法操作。按位或运算符会比较两个操作数在同一位置上的二进制位,如果任意一个为1,则结果的相应位就为1,否则为0。
现在,我们尝试通过组合这两个运算符实现1+2048=2049的效果:
int result = (1 << 0) | (1 << 11); // 结果为 2049
这里,(1 << 0)
对应于十进制的1,(1 << 11)
对应于十进制的2048,两者进行按位或运算,结果即为它们相加的值,即2049。这是因为二进制下1(00000000 00000001)和2048(00010000 00000000)没有重叠的1位,所以按位或的结果就是它们的二进制形式拼接在一起,转换为十进制即为2049。