Java语言中一个数 &0xFF的特殊用法

今天看到了一段代码,其中有一些细节让我百思不得其解

// 将一个数字转为对应的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个知识点:

  1. 按位与运算
  2. java自动类型提升

这2者我都明白,但是组合到一起却半天没看懂,体现了对知识不能很好的灵活运用


这里结合其他地方我的发现,&运算本质上都是在置位,复位

猜你喜欢

转载自blog.csdn.net/qq_45689267/article/details/108896729