-
对于原码反码和补码的解释
1. 二进制最高位是符号位,0代表正数,1代表负数,Java中的数都是有符号的
2. 正数的原码反码和补码都一样(三码合一)
3. 负数的反码 = 符号位不变其他位取反
4. 负数的补码 = 反码 + 1 = 原码符号位不变其他位取反 + 1
5. 负数的原码 = (补码 - 1)后,符号位不变其他位取反
6. 计算机在运算的时候,都是以该数的补码的形式来运算的
7. 在显示运算结果的时候,会把算好的补码再转换回原码的形式显示出来
-
按位运算符(& 、| 、^ 、~ )
按位与 & : 全为 1 ,结果是 1
按位或 | : 只要有一个是 1 ,结果就是 1
按位异或 ^ : 只要不一样就是 1
按位取反 ~ : 1 取反为 0 ,0 取反为 1
| a | b | 按位与 & | 按位或 | | 按位异或 ^ | 按位取反 ~ |
|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0 | 1 ---> 0 0 ---> 1 |
| 1 | 0 | 0 | 1 | 1 | |
| 0 | 1 | 0 | 1 | 1 | |
| 0 | 0 | 0 | 0 | 0 |
举例:
2 & 3 = 0b0010 & 0b0011 (原码表示)
= 0b0010 & 0b0011 (转换为补码)
= 0b0010 (算出补码结果)
= 0b0010 (转回原码)
= 2 (输出结果)
~-2 = ~0b10000000 00000000 00000000 00000010 (原码表示)
= ~0b11111111 11111111 11111111 11111110 (转换为补码)
= 0b00000000 00000000 00000000 00000001 (算出补码结果)
= 0b00000000 00000000 00000000 00000001 (转回原码)
= 1 (输出结果)
~2 = ~0b00000000 00000000 00000000 00000010 (原码表示)
= ~0b00000000 00000000 00000000 00000010 (转换为补码)
= 0b11111111 11111111 11111111 11111101 (算出补码结果)
= 0b10000000 00000000 00000000 00000011 (转回原码)
= -3 (输出结果)
2 | 3 = 0b00000000 00000000 00000000 00000010 |
0b00000000 00000000 00000000 00000011 (原码表示)
= 0b00000000 00000000 00000000 00000010 |
0b00000000 00000000 00000000 00000011 (转换为补码)
= 0b00000000 00000000 00000000 00000011 (算出补码结果)
= 0b00000000 00000000 00000000 00000011 (转回原码)
= 3 (输出结果)
2 ^ 3 = 0b00000000 00000000 00000000 00000010 ^
0b00000000 00000000 00000000 00000011 (原码表示)
= 0b00000000 00000000 00000000 00000010 ^
0b00000000 00000000 00000000 00000011 (转换为补码)
= 0b00000000 00000000 00000000 00000001 (算出补码结果)
= 0b00000000 00000000 00000000 00000001 (转回原码)
= 1 (输出结果)
-
算术逻辑运算符(<< 、>> 、>>> )
算术左移 << :符号位不变,高位溢出,低位补0,算术左移几位,就乘以2的几次方
算术右移 >> :符号位不变,高位补符号位的数,低位溢出,算术右移几位,就除以2的几次方
逻辑右移(无符号右移) >>> :符号位不变,高位补0,低位溢出

被折叠的 条评论
为什么被折叠?



