PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 这个地方结果是没错的,但是讲解上有一点疏忽。 首先是字面值的缺省值的知识点。0xFF是一个整数字面值(literal value),整数字面值的缺省类型是int,也就是说,它是一个32bit(也就是4byte)的数据。那么只写一个FF是什么意思呢?就是前面补充0,也就是说 int c = 0xFF; 等价于 int c = 0x000000FF; 然后是取反,就是每位都取反。取反后的结果就是0xFFFFFF00 为什么0xFFFFFF00会是-256呢?正如视频一句带过的,这和负数的表示方式有关系,负数(首个bit为1的数)的表示方式是补码。补码的规则是,正数的补码就是正数本身,负数的补码是除符号位以外,各位取反,然后末位加1,也就说,-256在变成补码之前是0x80000100,除符号位各位取反之后是0xFFFFFEFF,末位再加个1,就变成了0xFFFFFF00。 也就是0x000000FF各位取反的结果。所以~0x000000FF是十进制的-256的补码形态。 这是一个程序,拿走不谢 public class Reverse { public static void main(String[] args) { int origin = 0x000000FF; int originReverse = ~origin; int originReverseManually = 0xFFFFFF00; System.out.println(origin); System.out.println(originReverse); System.out.println(originReverseManually); } } 补充码是专门为计算机设计的一种优化计算的用来表示负数的编码方式。它是一种非常精妙而自然的设计,有兴趣的话建议你深入学习一下,为什么计算机要费这么大劲儿使用补码表示负数。
作者回复: 二进制和十进制的本质是一样的. 11101 转换成十进制就是 从右边向左数, 第5位是1, 这个1代表的值是1 x 2的4次方 = 16 从右边向左数, 第4位是1, 这个1代表的值是1 x 2的3次方 = 8 从右边向左数, 第3位是1, 这个1代表的值是1 x 2的2次方 = 4 从右边向左数, 第2位是0, 这个0代表的值是0 x 2的1次方 = 0 从右边向左数, 第1位是1, 这个1代表的值是1 x 2的0次方 = 1 所以11101这个二进制的数字, 代表的十进制数字就是16+8+4+0+1 = 29
作者回复: 总结的很好,尤其是最后一句,手动点赞👍
作者回复: 把例子程序抄几遍,抄明白了就是最好的练习
作者回复: 被你这么一说感觉好有道理。 不过这里命名的规则是:符号位不动,那么这个数的正负就不会变化,所以是带符号位移。符号位跟着动,那么数的正负就会变化,所以叫做无符号位移。
作者回复: 输出出来的都是十进制
作者回复: ✅
作者回复: 单片机这种资源有限的场景,节省资源就得一个bit一个bit的扣
作者回复: 补码转化,正数不变;负数除符号位各位取反,末位加一
作者回复: 正好是2的n次方的比较常用,用的多的也就记住了。 如果需要转换,可以考虑用下面几个方法。分别是把十进制的123转成2、8、16进制。以为涉及到类、方法等知识点,所以会在后面讲到。 Integer.toBinaryString(123); Integer.toOctalString(123); Integer.toHexString(123);