package demo2;
public class int_byte_long {
public static byte [] int2Bytes(int id) {
/*
* 如果将 int 类型左移或者右移大于或等于 32 位时,并不会像预计的那样将数据全部填充为1或0。
* java 的处理方式是:当刚好为数据长度的整数倍时,即32、64······,数据保持原来不变;其他情况下移动除以 32 余数的长度
* 由于传入的是int类,属于32位再"与"完之后再强行截断转为byte类型
* 十进制 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
* 对应十六进制 0 1 2 3 4 5 6 7 8 9 A B C D E F
* 右移24位之后的8143为 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
* & :一一为一,其它为0
*/
byte []arr=new byte[4];
// 这里的强行转换并不会出现数据丢失的情况,因为与过之后的int类变量id值只有-49和31值,byte包含这些值
// 8143的二进制表示为 0 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1
// FF对应十进制为255转为2进制为 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
arr[0]=(byte)((id>>0*8) & 255);//右移0位再“与”FF 结果:-49
// * 与之后的结果为 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 即207
// 与之后将int类的207强转为byte,因为byte长度为255 而且byte最大正整数为127,多余出来的80,从负数中取,
// * 其中,负号占1,则剩下79 79+(-128)=-49 即运行结果
arr[1]=(byte)((id>>1*8) & 255);//右移8位再“与”FF 结果: 31
// 右移8位之后的8143为 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 即 31
// 与之后结果为 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 即 31
arr[2]=(byte)((id>>2*8) & 255);//右移16位再“与”FF 结果: 0
// 右移16位之后的8143为 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 与之后结果为 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 即 0
arr[3]=(byte)((id>>3*8) & 255);//右移32位再“与”FF 结果: 0
// 右移24位之后的8143为 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
// 与之后结果为 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 即 0
return arr;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
byte[] arr=int_byte_long.int2Bytes(8143);
System.out.println(arr[0]+","+arr[1]+","+arr[2]+","+arr[3]);
System.out.println((8143>>16));
}
}
java:类型转换与位运算问题
最新推荐文章于 2022-11-16 17:16:48 发布