~|&^对应着按位非、或、与、异或,比较简单,就是用补码(正数补码为原码,负数为反码加1)每一位对齐,进行运算。比如5&9结果是1,因为5就是二进制101,9是1001(前面几位是0省略),5|9同理则为12。如果是求~ -5的话,首先-5对应二进制原码100000...101求得反码(源码除了第1位符号位外其他位置取反)得到111111...010,补码为1111....011,进行位异或后,取反后得到00000...100得到结果为4。
java一般有<<(左移),>>(右移)和>>>(无符号右移)三种,<<是在后面补0,前面溢出的不要管,扔掉即可,比如-5对应111...(29个1)011,移动后变成111..(27个1)01100,即结果为-5<<2变成-20 。 而>>就是用符号位补充高位,左边溢出的扔掉,这样子-5>>2就变成11.....(31个1)0,换成十进制就是-2了。而>>>就是总以0补充最高位,所以-5>>>2会输出1073748xxx....。