白痴了一波,基础很重要,今天我遇到了一个布尔运算就是~0=?,我下意识的人为~0=255。但是大错特错了,下面就说一说先来说几个概念:
用例子说一下原码、反码、补码。
二进制 | 原码 | 反码 | 补码 | |
4 | +100 | 00000100 | 00000100 | 00000100 |
-4 | -100 | 10000100 | 111110100 | 111110101 |
正数的原码、反码、补码都是本身,负数的原码为其绝对值的原码最高位(符号位)变为1,反码为符号位不变,其余取反,补码为反码加1。
~0各位取反为11111111但是java中默认是有符号的,所以要求其补码,即10000001=-1。大家不放记住一个公式:~a = -(a=1);简单又方便。再说几个容易混淆的
^:这个符号在java中不是求平方的,而是异或的操作,即相同为0,不同为1;
4<<2:0100向左移动2位,后面补0即4的2次方为16
4>>2:0100向右移动2位,前面补0为1
看箭头的方向,箭头朝向哪里就是向哪边移位。
【注】:负数的移位,将负数变为补码形式,右移高位补1,左移低位补0,在还原为原码
-4的补码11111100,右移2位高位补1为11111111。变为原码补码减1,除符号位取反为10000001为-1。
左移的话低位补0,过程简单,不说了,要回去了