1. 原码、反码、补码
所有数字在计算机底层都以二进制形式存在,计算机以补码的形式保存/计算所有的整数:
- 正数的原码、反码、补码都相同,就是正数的二进制数
- 负数的补码 = 反码 + 1
原码:直接将一个数值换成二进制数,最高位是符号位
反码(负数):排除符号位,对原码按位取反
补码(负数):排除符号位,对反码加1
补码 ==> 原码:对于正数,则三码合一; 对于负数:则补码取反加1
Java整数常量默认是int类型,当用二进制定义整数时,其第32位是符号位;当是long类型时,二进制默认占64位,第64位是符号位。
补充: 为什么计算机采用补码而不是原码或反码?_强哥叨逼叨的博客-优快云博客_计算机用原码还是补码
2. 进制转换
二进制:基数为2,由 0、1 组成
八进制:基数为8,由 0 - 7 组成
十进制:基数为10,由 0 - 9 组成
十六进制。基数为16,由 0 - 9、A、B、C、D、E、F 组成
二进制 <==> 八进制:3位二进制数表示1位八进制数
二进制 <==> 十进制:按权求和
二进制 <==>十六进制:4位二进制数表示1位十六进制数
3. 位运算
位运算是针对二进制的运算!!
a<<b | 左移:将二进制形式的a逐位左移b位,最低位空出的b位补0 |
a>>b | 带符号右移:将二进制形式的a逐位右移b位,最高位空出的b位补原来的符号位。 即:被移位的二进制最高位是0,右移后空缺位补0;最高位是1,右移后空缺位补1 |
a>>>b | 无符号右移:将二进制形式的a逐位右移b位,最高位空出的b位补0 |
a&b | 与运算:只有1&1时结果是1,否则是0 |
a|b | 或运算:只有0|0时结果是0,否则是1 |
a^b | 异或运算:相同二进制位进行 ^ 运算,结果是0,即:1^1=0 , 0^0=0; 不相同二进制位 ^ 运算结果是1,即:1^0=1 , 0^1=1 |
~a | 取反运算:二进制数补码,各位取反 |
左移:
右移:
取反:
ps:计算/存储使用的是补码,返回结果是原码!!