JAVA位运算
- 8进制:0开头整数,做多是7
- 16进制,以0x开头,做多是F,不管X还是x都可以,依照个人习惯即可
- Java使用 补 码 来 表 示 二 进 制 数 ,在补 码 表 示 中 ,最高 位 为 符号 位 ,正数 的 符 号 位 为 0,负数 为 1。补 码 的 规 定 如 下 :
1、对 正 数 来 说 ,最高位为 0,其余 各 位 代 表 数 值 本 身 (以二 进制 表 示 ),如 +42的补码 为 00101010。
2、对 负 数 而 言 ,把该 数 绝 对 值 的 补 码 按 位 取 反 ,然后 对 整 个数 加 1,即得 该 数的 补 码 。如 -1的补 码 为11111111111111111111111111111111(计算过程:00000000000000000000000000000001按 位 取 反 11111111111111111111111111111110+1=11111111111111111111111111111111 )。
对于正数来说首位为0代表符号位,表示正数
对于负数来说首位为1代表符号位,表示负数
为何有那么多0、1,java中int是32位的,对于+42而言,因为是正数,不需要取反,所以只需要8位就足以表示,而-1需要取反,所以需要扩充至32位
按位运算
- 1、按位 并(AND):&,把每一位按照AND进行,0是false,1是true,两个数按二进制计算,一旦有一位是0,则结果是0
操作 | 第一位 | 第二位 | 第三位 |
---|---|---|---|
操作数1 | 0 | 0 | 1 |
操作数2 | 0 | 1 | 1 |
按位与(&) | 0 | 1 | 1 |
例如:十进制10按位与十进制12–>
二进制1010按位与二进制1100–>
二进制结果1000–>
十进制结果8–>
结束
十进制-6按位与十进制-2–>
二进制-6的绝对值是110,-2的绝对值是10–>
二进制-6补码为:扩充至32位并取反并+1:11111111111111111111111111111010
二进制-2的2补码为:扩充至32位并取反+1:11111111111111111111111111111110 按位于的结果为:1111111111111111111111111111010
由于首位为1,代表负数,所以需要获取源码,步骤为:-1后取反
结果为:1111111111111111111111111111001取反
结果为:000000000000000000000000110
最后加上符号,结果为:-6
结束
正数与负数进行按位与(&)操作,原理同上,只需要看按位与之后的首位来判断符号。
- 按位 或(OR):|,把每一位按照OR进行,0是false,1是true,两个数按二进制计算,一旦有一位是1,则结果是1
操作 | 第一位 | 第二位 | 第三位 | 第四位 |
---|---|---|---|---|
操作数1 | 0 | 0 | 1 | 1 |
操作数2 | 0 | 1 | 0 | 1 |
按位或(|) | 0 | 1 | 1 | 1 |
- 按位 异或(XOR):^,把每一位按照OR进行,0是false,1是true,两个数按二进制计算,两位不一样是1,一样是0
操作 | 第一位 | 第二位 | 第三位 | 第四位 |
---|---|---|---|---|
操作数1 | 0 | 0 | 1 | 1 |
操作数2 | 0 | 1 | 0 | 1 |
按位或(|) | 0 | 1 | 1 | 0 |
- 按位 取反(按位非):~,每一位取反
操作 | 第一位 | 第二位 |
---|---|---|
操作数1 | 0 | 1 |
按位非(~) | 1 | 0 |
位移运算符
- 符号: >>>:无符号右移,符号位一起右移,左边补0,
低位溢出,高位补0。注意,无符号右移(>>>)中的符号位(最高位)也跟着变,无符号的意思是将符号位当作数字位看待。如:-1>>>1结果为2147483647。这个数字应该比较熟悉,看两个输出语句就知道是什么了:
System.out.println(Integer.toBinaryString(-1>>>1));
System.out.println(Integer.toBinaryString(Integer.MAX_VALUE));
输出结果为:
1111111111111111111111111111111
1111111111111111111111111111111
- 符号:>>:带符号右移,符号位不动,其余位右移,符号位后高位正数补0,负数补1
例如:10进制-6转换为1110,其中第一位1为符号位,负数进行右位移,获取其二进制补码,右移后高位补符号位,最后符号位不变,减一后按位取反 - <<:左移,低位补0
- 例如:2<<2结果即为8,十进制2转换成2进制为0010,左移两位。实际上使用计算的不是4位或8位,使用的是32位进行的位移
- 右移可以忽略