今天看到了一段代码,其中有一些细节让我百思不得其解
// 将一个数字转为对应的16进制表示
public static String byteToHexString (byte b) {
int v = b & 0xFF; //发生了自动类型提升
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
hv = "0" + hv;
}
return hv;
}
int v = b & 0xFF;
其中这行代码乍一看没用,让人以为好像什么作用都没有,实际上起到的作用就是保证了变量b的补码一致性
我们要使用Integer的API,所以要进行把byte转为int,但是这样的转换很明显位数会发生变化,看了网上大佬的总结,JAVA以补码存储数据,这一步运算(红色高亮部分)其实就是为了保证补码不变化,说的明白点就是让以前8位时候补码是多少现在扩充了之后这个补码的值也不能变,但这样的话如果是一个负数的话执行了这一行则值必然会变化,这么做的好处是什么???
请看下图↓
采用这种方式后的输出
若是不采用这种方式,则↓
很明显,目的就是为了去除掉负数补码高位的1,让我们可以观察结果数据时候更加直观,这也反映了计算机底层知识的重要性
这段代码主要是2个知识点:
- 按位与运算
- java自动类型提升
这2者我都明白,但是组合到一起却半天没看懂,体现了对知识不能很好的灵活运用
这里结合其他地方我的发现,&运算本质上都是在置位,复位