按位非只需要一个操作数,这个运算符将把操作数在计算机底层的二进制码按位(包括符号位)取反。如下代码测试了按位与和按位 或运算的运行结果。 程序执行的结果是:5&9的结果是1,5|9的结果是13。下面介绍运算原理。 5的二进制码是00000101(省略了前面的24个0),而9的二进制码 是00001001(省略了前面的24个0)。
下面是按位异或和按位取反的执行代码
程序执行~-5的结果是4,执行5^9的结果是12。下面来介绍运算原理。
左移运算符是将操作数的二进制码整体左移指定位数,左移后右边空出来的位以0填充。
上面的32位数是-5的补码,左移两位后得到一个二进制补码,这个二进制补码的最高位是1,表明是一个负数,换算成十 进制数就是-20。 Java的右移运算符有两个:>>和>>>,对于>>运算符而言,把第一 个操作数的二进制码右移指定位数后,左边空出来的位以原来的符号 位填充,即如果第一个操作数原来是正数,则左边补0;如果第一个操 作数是负数,则左边补1。>>>是无符号右移运算符,它把第一个操作 数的二进制码右移指定位数后,左边空出来的位总是以0填充。
看下面代码
下面用示意图来说明>>和>>>运算符的运算过程。 -5右移2位后左边空出2位,空出来的2位以符号位 补充。从图中可以看出,右移运算后得到的结果的正负与第一个操作 数的正负相同。右移后的结果依然是一个负数,这是一个二进制补 码,换算成十进制数就是-2从图来看,-5无符号右移2位后左边空出2位,空出来的2位以 0补充。从图中可以看出,无符号右移运算后的结果总是得到一个正 数。图中下面的正数是1073741822(2 30 -2)。
进行移位运算时还要遵循如下规则。 ➢ 对于低于int类型(如byte、short和char)的操作数总是先自动类型转换为int类型后再移位。 ➢ 对于int类型的整数移位a>>b,当b>32时,系统先用b对32求余(因为int类型只有32位),得到的结果才是真正移位的位数。 例如,a>>33和a>>1的结果完全一样,而a>>32的结果和a相同。 ➢ 对于long类型的整数移位a>>b,当b>64时,总是先用b对64求余(因为long类型是64位),得到的结果才是真正移位的位 数。 注意: 当进行移位运算时,只要被移位的二进制码没有发生有效位的数字丢失(对于正数而言,通常指被移出的位全部都是0),不难发 现左移 n 位就相当于乘以2的 n 次方,右移 n 位则是除以2的 n 次方。不 仅如此,进行移位运算不会改变操作数本身,只是得到了一个新的 运算结果,而原来的操作数本身是不会改变的。



